How to create a single-use Discord bot script with discord.py?

Hey folks! I’m trying to figure out how to make a Discord bot that does a quick task and then exits. Most bot examples I’ve seen use a constant loop, but I want something different.

I’m hoping to do something like this:

import discordlib

SECRET_KEY = 'myS3cretK3y'

discordlib.start_session(SECRET_KEY)
discordlib.post_message('Hello, world!')
discordlib.end_session()

I’ve played around with async stuff, but it got messy with threads. Is there an easier way to do this?

The goal is to have a button that, when clicked, makes the bot do its thing and then lets the program continue with other tasks.

Any ideas? Thanks in advance!

hey there! have u tried using asyncio.run() with a custom coroutine? something like this might work:

import asyncio
import discord

async def quick_bot():
    client = discord.Client()
    await client.start('YOUR_TOKEN')
    channel = client.get_channel(CHANNEL_ID)
    await channel.send('hi world!')
    await client.close()

asyncio.run(quick_bot())

this should do the trick without needing loops or threads. lmk if u need more help!

I’ve actually tackled this issue before when building a Discord bot for our game server. Instead of using the traditional event loop, you can leverage coroutines and asyncio to create a single-use bot script. Here’s a simplified approach that worked for me:

import asyncio
import discord

async def run_bot():
    client = discord.Client()
    await client.login('YOUR_BOT_TOKEN')
    
    channel = await client.fetch_channel(CHANNEL_ID)
    await channel.send('Hello, World!')
    
    await client.close()

asyncio.run(run_bot())

This script logs in, sends a message, and then closes the connection. It’s clean, efficient, and doesn’t leave the bot running indefinitely. Just remember to replace ‘YOUR_BOT_TOKEN’ and CHANNEL_ID with your actual values.

One caveat: Make sure you’re not hitting Discord’s rate limits if you’re running this frequently. Happy coding!

While the previous answer offers a good solution, there’s another approach you might find useful. You can use the discord.ext.commands framework with a custom bot class. Here’s an example:

import discord
from discord.ext import commands

class OneTimeBot(commands.Bot):
    async def on_ready(self):
        channel = self.get_channel(YOUR_CHANNEL_ID)
        await channel.send('Hello, World!')
        await self.close()

bot = OneTimeBot(command_prefix='!')
bot.run('YOUR_BOT_TOKEN')

This method allows you to define custom behavior in the on_ready event. The bot will send the message and then close itself. It’s straightforward and doesn’t require manual asyncio handling. Just replace YOUR_CHANNEL_ID and YOUR_BOT_TOKEN with your actual values.

Remember to handle potential exceptions and ensure you’re not violating Discord’s rate limits if you’re running this script frequently.