I am trying to create an event roster bot with an option selection menu (contains register, remove and delete).
How can I make this persistent even after a bot restart?
I have the timeout on the view equal to None. I also have tried using bot.add_view() in on_ready and that also did not work.
here is the command to create a new roster
@bot.slash_command(name = 'roseter-activity', description = 'create a roster for a dungeon, trial, or arena')
@discord.option("activity_name", description="Choose your activity", autocomplete=get_activity)
@discord.option('level', description='Choose the level of the activity', choices = ['Normal', 'Veteran'])
async def activityRoster(ctx, activity_name, level, date, time, timezone, tank_count = 0, healer_count = 0, dps_count = 0):
category = ctx.channel.category
if level == 'Veteran':
level_name = 'Veteran '
level_abr = 'v'
else:
level_name = 'Normal '
level_abr = 'n'
eType, abr, activity_name = getType(activity_name)
channel = await ctx.guild.create_text_channel(name = level_abr + abr + ' ' + date.replace('/','-'), category = category)
seats = 0
if eType == 'Trial':
if tank_count == 0:
tankNum = 2
else:
tankNum = tank_count
if healer_count == 0:
healerNum = 2
else:
healerNum = healer_count
if dps_count == 0:
dpsNum = 8
else:
dpsNum = dps_count
elif eType == 'Dungeon':
if tank_count == 0:
tankNum = 1
else:
tanknum = tank_count
if healer_count == 0:
healerNum = 1
else:
healerNum = healer_count
if dps_count == 0:
dpsNum = 2
else:
dpsNum = dps_count
else:
tankNum = 0
healerNum = 0
dpsNum = 0
seats = 4
if eType == 'Arena':
message = await channel.send(view = eventView(timeout=None), embed = createEmbed(ctx.author, eType, (level_name + activity_name), date, time, timezone, tankNum=tankNum, healerNum=healerNum, dpsNum=dpsNum, seats=seats))
else:
message = await channel.send(view = activityView(timeout=None), embed = createEmbed(ctx.author, eType, (level_name + activity_name), date, time, timezone, tankNum=tankNum, healerNum=healerNum, dpsNum=dpsNum, seats=seats))
#await addReactions(message, seats)
#await ctx.respond('created roster in ' + channel.mention, ephemeral = True)
return channel
here is the activiteView class
class activityView(View):
@discord.ui.select( placeholder = 'Select Option',
custom_id = 'activitySelect',
options = [
discord.SelectOption(label = 'Register Tank', emoji = tank),
discord.SelectOption(label = 'Register Healer', emoji = heal),
discord.SelectOption(label = 'Register DPS', emoji = damage),
discord.SelectOption(label = 'Remove', emoji = remove),
discord.SelectOption(label = 'Delete Roster', emoji = delete)
]
)
async def select_callback(self, select, interaction):
option = select.values[0]
user = interaction.user
message = interaction.message
embed = message.embeds[0]
if option == 'Remove':
await interaction.response.edit_message(embed = removeUser(user, embed))
elif option == 'Register Tank':
await interaction.response.edit_message(embed = addTank(user, embed))
elif option == 'Register Healer':
await interaction.response.edit_message(embed = addHealer(user, embed))
elif option == 'Register DPS':
await interaction.response.edit_message(embed = addDPS(user, embed))
elif option == 'Delete Roster':
if str(user) in embed.fields[0].name:
await interaction.channel.delete()
Adding
bot.add_view(activityView())
to your on_ready should fix your problem.