#Infinite Event loops

1 messages · Page 1 of 1 (latest)

ebon jackal
#

how to make sure that the bot doesnt listen to events it did itself

spare radishBOT
#

Hey! Once your issue is solved, press the button below to close this thread!

ebon jackal
#

basically in the callback for a member update event, my bot updates a member

#

so it just loops forever

#

pmo

#

i tried storing a list of MemberUpdate() objects and comparing them to the incoming event but it doesn't seem to work (prob some random annoying attribute)

    @listen(MemberUpdate)
    async def member_update(self, event: MemberUpdate):
        if event in self.event_by_bot:
            return
#

this is how i add objects to the list

    def add_event_by_bot(self, before: Member, role: Role, added: bool = True):
        print(before)
        after = before
        after.roles.append(role) if added else after.roles.remove(role)
        self.event_by_bot.append(
            MemberUpdate(before.guild.id, before, after, bot=self.bot)
        )
dusky vortex
ebon jackal
#

basically i want it so

#

u cant get given a role unless u use the command

#

since everytime the role is given, their role must be updated backend

#
    @listen(MemberUpdate)
    async def member_update(self, event: MemberUpdate):
        if event in self.event_by_bot:
            return

        after_roles = event.after.roles
        before_roles = event.before.roles

        senior_tester_id = config.get_setting("senior_tester_role", 0)

        senior_tester_ids = config.get_setting("senior_testers_roles", {})

        tester_id = config.get_setting("tester_role", 0)

        tester_ids = config.get_setting("tester_roles", {})

        roles = (
            [
                event.after.guild.get_role(senior_tester_id),
                event.after.guild.get_role(tester_id),
            ]
            + [
                event.after.guild.get_role(senior_tester_ids[gamemode])
                for gamemode in senior_tester_ids
            ]
            + [
                event.after.guild.get_role(tester_ids[gamemode])
                for gamemode in tester_ids
            ]
        )

        for role in roles:
            if role in after_roles and role not in before_roles:  # role gained
                self.add_event_by_bot(
                    event.before, event.before.guild.get_role(role.id), False
                )
                await event.after.remove_role(role.id, "only use /tester promote")
                break
            if role not in after_roles and role in before_roles:
                self.add_event_by_bot(
                    event.before, event.before.guild.get_role(role.id)
                )
                await event.after.add_role(role.id, "only use /tester demmote")
                break
#

now that's fine and all

#

let's say someone uses /tester promote and the member updates

#

this event will be listened to

#

it will remove the role but that counts as a member update and will trigure itself infinitely

#

@dusky vortex

ebon jackal
#

@buoyant sail any ideas?