Выполнить команду, прежде чем бот перейдет в автономный режим

#python-3.x #discord.py

#python-3.x #discord.py

Вопрос:

В настоящее время я являюсь хостинговым ботом discord на Heroku, и он работает нормально. Но проблема с Heroku заключается в том, что у меня всего около 500 бесплатных часов хостинга (я не могу вспомнить точное число). Меня это немного раздражает, поскольку я использую бота для запуска каналов предложений. И всякий раз, когда кто-то что-то говорит в канале предложений, пока бот отключен, ответа от бота нет (предполагается, что бот удаляет сообщение пользователя и отправляет его снова в embed).

Решение, которое я нашел, — создать команду для закрытия канала предложений, когда бот собирается перейти в автономный режим. Я тоже делал это долгое время, пока однажды не забыл отключить его. Затем все отправляли сообщения в канале предложений, не зная, что происходит. Итак, теперь я хотел бы знать, есть ли способ заставить бота выполнить команду закрытия канала, прежде чем он перейдет в автономный режим. Вот команда для закрытия канала:

 @commands.command(aliases=['close-server'])
    @commands.is_owner()
    async def closeserver(self, ctx):
        if ctx.guild.id != 735105735792394251:
            return

        await ctx.channel.purge(limit=1)
        for user in ctx.guild.members:

            member = discord.utils.get(ctx.guild.roles, name='Member')

            bot_offline = discord.utils.get(ctx.guild.roles, name='Bot Currently Offline')

            if member in user.roles:
                await user.add_roles(bot_offline)
            else:
                not_verified = discord.utils.get(ctx.guild.roles, name='Not_Verified')
                await user.add_roles(not_verified)

            await user.remove_roles(member)
        announcements = self.bot.get_channel(735106648330469488)
        await announcements.send('**___`The server Is closed`___**')
 

И это команда для повторного открытия канала:

 @commands.command(aliases=['open-server'])
    @commands.is_owner()
    async def openserver(self, ctx):
        if ctx.guild.id != 735105735792394251:
            return

        await ctx.channel.purge(limit=1)
        for user in ctx.guild.members:

            member = discord.utils.get(ctx.guild.roles, name='Member')
            bot_offline = discord.utils.get(ctx.guild.roles, name='Bot Currently Offline')
            if bot_offline in user.roles:
                await user.add_roles(member)
            else:
                not_verified = discord.utils.get(ctx.guild.roles, name='Not_Verified')
                await user.remove_roles(not_verified)
            await user.remove_roles(bot_offline)
        announcements = self.bot.get_channel(735106648330469488)
        await announcements.send('**___`The server Is opened`___**')
 

Что мне делать, используя мой текущий скрипт для закрытия и открытия сервера?

Ответ №1:

Я бы рекомендовал переформатировать вашу команду во что-то вроде:

 @commands.command()
@commands.is_owner()
async def close(self, ctx):

    member = ctx.message.author # set the person who wrote the message equal to a variable

    if ctx.guild.id != 735105735792394251: # your check system
        return
    await ctx.send("The Server Is Now Closed!") # announcement to be sent when command is executed
    
    overwrites = {
        overwrite.send_messages = False,
        overwrite.read_messages = True
    } # this overwrites the current permissions on the channel
    await channel.set_permissions(member, overwrites=overwrites) # typehint the member, and the overwrites

 

Документацию по изменению разрешений канала можно найти здесь
но это то, что я рекомендую делать что-то вроде. Прошу прощения, если это не то, к чему вы стремились, но я подумал, что это может помочь как оптимизировать, так и тому подобное. И когда вы записываете свою команду в open резервную копию канала, измените имя команды с close на open на, а затем переключите свои разрешения overwrites = {} , и это должно выполнить то, что вам нужно, если вы решили пойти по этому пути.

Комментарии:

1. На самом деле, две команды добавляют / удаляют роли для всех членов гильдии, чтобы они больше не могли получать доступ к каналам. Я думаю, именно поэтому они так похожи. —РЕДАКТИРОВАТЬ — Таким образом, вы можете заметить, что close-server команда заканчивается на: await user.remove_roles(bot_offline) … While open-server заканчивается на await user.remove_roles(bot_offline)

2. Но да, то, что вы сказали мне сделать, может быть более упрощенной версией моего кода. Я исправлю это, спасибо.

3. Я увидел это после того, как опубликовал то, что сказал. извиняюсь с моей стороны. Если вы сможете заставить свою версию работать, пожалуйста, дайте мне знать. Я хотел бы увидеть конечный результат!

4. Не волнуйтесь! Кроме того, позже вы можете удалить свой ответ, если увидите, что что-то не так. И если вы хотите изменить его, вы также можете отредактировать его.

5. добрый день, сэр / мадам 🙂