Search code examples
pythondiscordpycord

Pycord Selection option View Persistance


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()

Solution

  • Adding

    bot.add_view(activityView())
    

    to your on_ready should fix your problem.