DEV Community

Cover image for A Better Quoting System [Live Coding Recap]
πŸ’Ύ bun9000
πŸ’Ύ bun9000

Posted on β€’ Edited on

1

A Better Quoting System [Live Coding Recap]

Streamed: 10/27 on Twitch

Topic(s): We created a persistent data system for the Twitch Bot
Language: Python, JSON
Tech & libs used: VSCode, TwitchIO

πŸ‘‡ You can find the code we wrote on stream down below! :D

⭐ Star β‡’ Project Repository
πŸ’œ Follow β‡’ on Twitch and GitHub
πŸ”΄ Watch β‡’ Twitch VOD (replay)

During the stream we...

βœ” unboxed the a hat from DEV!! Ty!!
βœ” changed voice on tts to Brian
βœ” moved !project command to DeepThonk
βœ” get !quoth partially working
βœ” handled a case of key-errors
βœ” tested out the fixes - it works!
βœ” worked on vscode for the next live coding article for a bit
βœ” ended the night playing video games w/community

Making the quote system

We made a command called !quoth that takes a user name as an argument and saves the last thing that user said as a quote.

BestCoderNA: I'm not totally useless. I can be used as a bad example!
F1SavesLives: !quoth @BestCoderNA
QUOTE SAVED: "I'm not totally useless. I can be used as a bad example!" - @BestCoderNA

Here's the entry point to the quoth feature. It's an async command registered in the bot's event loop. You invoke it by sending !quoth in chat.

# commands.py
@bot.command(name="quoth")
async def quoth(ctx):
    'the raven, nevermore. nevermore.'
    token = ctx.content.split(' ', 1)  # tokenizeβ„’
    author = token[1].lower()  # match case for msg database keys
    if author[0] == '@':  # strip the @ if tagged
        author = author[1:]
    data.quoth(author)
Enter fullscreen mode Exit fullscreen mode

Every message sent in chat is added to a dictionary with a key of the user name.

# called in event_message():
def save_last_message(self, author, msg):
    if msg[0] == '!':  # ignore commands
        return
    if msg[0] == '@': # strip tags if tagged
        author = author[1:]
    self.last_message[author] = msg
    log.debug(f"saved: {author} - {self.last_message[author]}")
Enter fullscreen mode Exit fullscreen mode

In our data object, which is our JSON "database" interface, we use the quoth method to append the python quote to a list of quotes.

# in the `data` object, an instance of DataInterface
def quoth(self, author):
    'take in an author name and add the last thing said from them'

    try:  # check if they've even said anything yet
        incoming_quote = {
            "author" : author,
            "quote" : self.last_message[author]
        }
    except KeyError:
        log.debug(f"{author} hasn't said anything yet...")

    # pull the json data to an object
    with open('quotes.json') as json_file:
        data = json.load(json_file)
        quotes = list()
        for quote in data:
            quotes.append(quote) # add all the quotes from json to a list
        quotes.append(incoming_quote) # add the new quote to the end of the list
        log.debug(f"QUOTE SAVED! {incoming_quote}")

    # rewrite with the new quote
    with open('quotes.json', 'w+') as json_file:
        json.dump(quotes, json_file, indent=4)  # dump it back in to jso
Enter fullscreen mode Exit fullscreen mode

And here's the JSON "database" after we tested it out with a few quotes!

[
    {
        "author": "Jigokuniku",
        "quote": "TBH, some best practices are really only ever learned by getting annoyed at the bad practice"
    },
    {
        "author": "NinjaBunny9000",
        "quote": "JUST πŸ‘ BECAUSE πŸ‘ IT'S πŸ‘ EATABLE πŸ‘ DOESN'T πŸ‘ MEAN πŸ‘ IT'S πŸ‘ EDIBLE πŸ‘"
    },
    {
        "author": "J0nnyclueless",
        "quote": "I sometimes get kernel panic attacks"
    },
    {
        "author": "Sockelo",
        "quote": "Forgive them, for they know not what they compile."
    }
]
Enter fullscreen mode Exit fullscreen mode

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here β†’

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

πŸ‘‹ Kindness is contagious

Please leave a ❀️ or a friendly comment on this post if you found it helpful!

Okay