#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)
… Whileopen-server
заканчивается наawait user.remove_roles(bot_offline)
…2. Но да, то, что вы сказали мне сделать, может быть более упрощенной версией моего кода. Я исправлю это, спасибо.
3. Я увидел это после того, как опубликовал то, что сказал. извиняюсь с моей стороны. Если вы сможете заставить свою версию работать, пожалуйста, дайте мне знать. Я хотел бы увидеть конечный результат!
4. Не волнуйтесь! Кроме того, позже вы можете удалить свой ответ, если увидите, что что-то не так. И если вы хотите изменить его, вы также можете отредактировать его.
5. добрый день, сэр / мадам 🙂