如何在discord.py中使用on_raw_reaction_add?

2024-01-09

好吧,我有一个程序,一个票务系统。它以 JSON 格式记录工单创建消息 ID,以便在程序重新启动时可以继续检查是否添加了新的反应。但我发现该消息必须加载到机器人的缓存中,但一旦重新启动,它就不会存在。所以我发现on_raw_reaction_add。有人可以向我解释这是如何工作的,并且可能对我的代码进行一些修改。另外,我已经尝试过此操作,但我删除了代码以尝试其他操作,但现在我无法将其恢复。但我收到此错误,并且我的机器人具有管理员权限:discord.errors.Forbidden: 403 FORBIDDEN (error code: 50001): Missing Access。请帮忙!

Code:

from discord.ext import commands
from discord.ext import tasks
import asyncio
import discord
import json
import datetime

class TicketSystem(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    async def read_json_to_dict(self, json_file_name, channel):
        json_dict = {}

        try:
            with open(f"json/{json_file_name}", "r") as json_file:
                json_dict = json.load(json_file)
        except:
            embed_message = discord.Embed(title="Error: JSON", description="Please create a support ticket in the Nexus Developments Discord to get this resolved - https://discord.gg/YmdugDf",colour=discord.colour.Colour.red())
            embed_message.set_footer(text="Created By Nexus Developments - https://discord.gg/YmdugDf", icon_url="https://i.imgur.com/MRBsIpe.png")

            await channel.send(embed=embed_message)

        return json_dict

    async def check_create_ticket_reaction(self, reaction, user):
        create_ticket_msgs_dict = await self.read_json_to_dict("create_ticket_msgs_ids.json", reaction.message.channel)

        if str(reaction.message.id) in create_ticket_msgs_dict.keys():
            if str(reaction.emoji) == "????":
                if user != self.bot.user:
                    return True

    async def check_ticket_lock_reaction(self, reaction, user):
        lock_ticket_message_dict = await self.read_json_to_dict("lock_ticket_msg_id.json", reaction.message.channel)

        if str(reaction.message.id) in lock_ticket_message_dict.keys():
            if user != self.bot.user:
                return True

    async def get_ticket_counter(self, message):
        ticket_counter_dict = await self.read_json_to_dict("ticket_counter.json", message.channel)

        current_ticket_number = ticket_counter_dict.get(str(message.guild.id))

        if current_ticket_number is None:
            current_ticket_number = 0

        return current_ticket_number

    async def get_guild_ticket_catergory(self, message):
        ticket_categories_dict = await self.read_json_to_dict("ticket_categories_ids.json", message.channel)

        guild_ticket_category_id = ticket_categories_dict.get(str(message.guild.id))

        guild_ticket_category = discord.utils.get(message.guild.categories, id=guild_ticket_category_id)

        if guild_ticket_category is None:
            embed_message = discord.Embed(title="Error: TicketCategoryNotFound", description="Please create a support ticket in the Nexus Developments Discord to get this resolved - https://discord.gg/YmdugDf", colour=discord.colour.Colour.red())
            embed_message.set_footer(text="Created By Nexus Developments - https://discord.gg/YmdugDf", icon_url="https://i.imgur.com/MRBsIpe.png")

            await message.channel.send(embed=embed_message)
        else:
            return guild_ticket_category

    async def get_guild_support_roles(self, message):
        support_roles_dict = await self.read_json_to_dict("support_roles_ids.json", message.channel)

        guild_support_role_id = support_roles_dict.get(str(message.guild.id))

        guild_support_role = discord.utils.get(message.guild.roles, id=guild_support_role_id)

        if guild_support_role is None:
            embed_message = discord.Embed(title="Error: SupportRolesNotFound", description="Please create a support ticket in the Nexus Developments Discord to get this resloved - https://discord.gg/YmdugDf", colour=discord.colour.Colour.red())
            embed_message.set_footer(text="Created By Nexus Developments - https://discord.gg/YmdugDf", icon_url="https://i.imgur.com/MRBsIpe.png")

            await message.channel.send(embed=embed_message)
        else:
            return guild_support_role

    async def write_ticket_counter_to_json(self, message, current_ticket_number):
        ticket_counter_dict = await self.read_json_to_dict("ticket_counter.json", message.channel)

        ticket_counter_dict[str(message.guild.id)] = current_ticket_number

        with open("json/ticket_counter.json", "w") as ticket_counter_json:
            json.dump(ticket_counter_dict, ticket_counter_json)

    async def create_ticket_transcript(self, ticket_channel: discord.TextChannel):
        ticket_channel_messages = await ticket_channel.history(oldest_first=True).flatten()

        transcript_path = f"transcripts/{datetime.date.today()}_{ticket_channel.name}_Transcript.txt"

        with open(transcript_path, "w+") as ticket_transcript:
            for ticket_channel_message in ticket_channel_messages:
                ticket_transcript.write(f"{ticket_channel_message.created_at} - {ticket_channel_message.author.name}#{ticket_channel_message.author.discriminator} - {ticket_channel_message.content}\n")

        return transcript_path

    async def write_ticket_id_to_user_id(self, ticket_channel, user):
        ticket_creator_dict = await self.read_json_to_dict("ticket_creator_ids.json", ticket_channel)

        ticket_creator_dict[str(ticket_channel.id)] = user.id

        with open("json/ticket_creator_ids.json", "w") as ticket_creator_json:
            json.dump(ticket_creator_dict, ticket_creator_json)

    async def write_lock_msg_id_to_json(self, message):
        lock_message_id_dict = await self.read_json_to_dict("lock_ticket_msg_id.json", message.channel)

        lock_message_id_dict[str(message.id)] = message.channel.id

        with open("json/lock_ticket_msg_id.json", "w") as lock_message_json_file:
            json.dump(lock_message_id_dict, lock_message_json_file)

    @commands.Cog.listener()
    async def on_reaction_add(self, reaction, user):
        create_ticket_msg = reaction.message

        checked_create_ticket_reaction = await self.check_create_ticket_reaction(reaction, user)

        checked_ticket_lock_reaction = await self.check_ticket_lock_reaction(reaction, user)

        if checked_ticket_lock_reaction:
            await self.close_ticket(reaction.message.channel, user, reaction.message.guild, reaction.message.channel)

        if checked_create_ticket_reaction:
            confirm_embed_message = discord.Embed(description="Please confirm your ticket creation with ✅ (for yes) and ❎ (for no)", color=discord.colour.Colour.green())
            confirm_embed_message.set_footer(text=f"Created By Nexus Developments - https://discord.gg/YmdugDf", icon_url="https://i.imgur.com/MRBsIpe.png")

            await create_ticket_msg.add_reaction("✅")
            await create_ticket_msg.add_reaction("❎")

            confirm_creation_msg = await create_ticket_msg.channel.send(embed=confirm_embed_message)

            def ticket_creation_check(ticket_creation_reaction, ticket_creation_user):
                return ticket_creation_user == user and str(ticket_creation_reaction.emoji) in {"✅", "❎"}

            try:
                ticket_creation_reaction, ticket_creation_user = await self.bot.wait_for("reaction_add", timeout=60.0, check=ticket_creation_check)
            except asyncio.TimeoutError:
                for reaction in ["????", "✅", "❎"]:
                    await create_ticket_msg.remove_reaction(reaction, user)

                for reaction in ["✅", "❎"]:
                    await create_ticket_msg.remove_reaction(reaction, self.bot.user)

                await confirm_creation_msg.delete()
            else:
                await confirm_creation_msg.delete()

                if str(ticket_creation_reaction.emoji) == "❎":
                    for reaction in ["????", "✅", "❎"]:
                        await create_ticket_msg.remove_reaction(reaction, user)

                    for reaction in ["✅", "❎"]:
                        await create_ticket_msg.remove_reaction(reaction, self.bot.user)

                if str(ticket_creation_reaction.emoji) == "✅":
                    for reaction in ["????", "✅", "❎"]:
                        await create_ticket_msg.remove_reaction(reaction, user)

                    for reaction in ["✅", "❎"]:
                        await create_ticket_msg.remove_reaction(reaction, self.bot.user)

                    current_ticket_number = await self.get_ticket_counter(create_ticket_msg)
                    guild_ticket_category = await self.get_guild_ticket_catergory(create_ticket_msg)
                    guild_support_role = await self.get_guild_support_roles(create_ticket_msg)

                    ticket_channel_overwrites = {
                        guild_support_role: discord.PermissionOverwrite(read_messages=True),
                        user: discord.PermissionOverwrite(read_messages=True),
                        create_ticket_msg.guild.default_role: discord.PermissionOverwrite(read_messages=False)
                    }

                    current_ticket_number += 1

                    users_ticket_channel = await guild_ticket_category.create_text_channel(f"ticket-{current_ticket_number}", overwrites=ticket_channel_overwrites)

                    await self.write_ticket_counter_to_json(create_ticket_msg, current_ticket_number)

                    await self.write_ticket_id_to_user_id(users_ticket_channel, user)

                    ticket_embed_message = discord.Embed(description=f"Support will be with you shortly.\nTo close this ticket react with ????", color=discord.colour.Colour.green())
                    ticket_embed_message.set_footer(text=f"Created By Nexus Developments - https://discord.gg/YmdugDf", icon_url="https://i.imgur.com/MRBsIpe.png")

                    await users_ticket_channel.send(f"{user.mention} {guild_support_role.mention}")
                    users_ticket_channel_embed = await users_ticket_channel.send(embed=ticket_embed_message)
                    await users_ticket_channel_embed.add_reaction("????")

                    await self.write_lock_msg_id_to_json(users_ticket_channel_embed)

    async def close_ticket(self, channel, author, guild, ticket_channel: discord.TextChannel = None):
        if ticket_channel is None:
            ticket_channel = channel

        confirm_closure_embed_message = discord.Embed(description=f"Please confirm the closure of {ticket_channel.mention}\n React with ✅ to close and ❎ to keep the ticket open", timestamp=datetime.datetime.now(), colour=discord.colour.Colour.red())
        confirm_closure_embed_message.set_footer(text=f"Created By Nexus Developments - https://discord.gg/YmdugDf", icon_url="https://i.imgur.com/MRBsIpe.png")

        confirm_closure_message = await channel.send(embed=confirm_closure_embed_message)
        await confirm_closure_message.add_reaction("✅")
        await confirm_closure_message.add_reaction("❎")

        def ticket_creation_check(ticket_closure_reaction, ticket_closure_user):
            return ticket_closure_user == author and str(ticket_closure_reaction.emoji) in {"✅", "❎"}

        try:
            ticket_closure_reaction, ticket_closure_user = await self.bot.wait_for("reaction_add", timeout=60.0, check=ticket_creation_check)
        except asyncio.TimeoutError:
            return
        else:
            if str(ticket_closure_reaction.emoji) == "❎":
                return

            if str(ticket_closure_reaction.emoji) == "✅":
                ticket_creator_dict = await self.read_json_to_dict("ticket_creator_ids.json", channel)
                ticket_creator_user_id = ticket_creator_dict.get(str(ticket_channel.id))
                ticket_creator_user = discord.utils.get(guild.members, id=ticket_creator_user_id)

                await ticket_channel.set_permissions(ticket_creator_user, send_messages=False, add_reactions=True, read_messages=True)

                transcript_status_embed_message = discord.Embed(description="Creating Transcript...", timestamp=datetime.datetime.now(), colour=discord.colour.Colour.orange())
                transcript_status_embed_message.set_footer(text=f"Created By Nexus Developments - https://discord.gg/YmdugDf", icon_url="https://i.imgur.com/MRBsIpe.png")

                transcript_status_message = await channel.send(embed=transcript_status_embed_message)

                transcript_path = await self.create_ticket_transcript(ticket_channel)

                transcript_dm_user = await self.bot.fetch_user(223200232232452096)

                transcript_status_embed_message = discord.Embed(description=f"Created Transcript. Sending transcript to {transcript_dm_user.name}#{transcript_dm_user.discriminator}", timestamp=datetime.datetime.now(), colour=discord.colour.Colour.green())
                transcript_status_embed_message.set_footer(text=f"Created By Nexus Developments - https://discord.gg/YmdugDf", icon_url="https://i.imgur.com/MRBsIpe.png")

                await transcript_status_message.edit(embed=transcript_status_embed_message)

                if transcript_dm_user.dm_channel is None:
                    await transcript_dm_user.create_dm()

                transcript_file = discord.File(transcript_path)

                transcript_dm_embed_message = discord.Embed(title=f"Support Ticket Transcript: {ticket_channel.name}", timestamp=datetime.datetime.now(), colour=discord.colour.Colour.green())
                transcript_dm_embed_message.set_footer(text=f"Created By Nexus Developments - https://discord.gg/YmdugDf", icon_url="https://i.imgur.com/MRBsIpe.png")

                await transcript_dm_user.dm_channel.send(embed=transcript_dm_embed_message, file=transcript_file)

                ticket_closure_embed_message = discord.Embed(description=f"Ticket has been closed by {author.name}#{author.discriminator}", timestamp=datetime.datetime.now(), colour=discord.colour.Colour.green())
                ticket_closure_embed_message.set_footer(text=f"Created By Nexus Developments - https://discord.gg/YmdugDf", icon_url="https://i.imgur.com/MRBsIpe.png")

                await ticket_channel.send(embed=ticket_closure_embed_message)

                ticket_closure_option_embed_message = discord.Embed(description="Reopen Ticket: ????\nDelete Ticket: ⛔", timestamp=datetime.datetime.now(), colour=discord.colour.Colour.red())
                ticket_closure_option_embed_message.set_footer(text=f"Created By Nexus Developments - https://discord.gg/YmdugDf", icon_url="https://i.imgur.com/MRBsIpe.png")

                ticket_closure_options_message = await ticket_channel.send(embed=ticket_closure_option_embed_message)
                await ticket_closure_options_message.add_reaction("????")
                await ticket_closure_options_message.add_reaction("⛔")

                def ticket_options_check(ticket_options_reaction, ticket_options_user):
                    return ticket_options_user != self.bot.user and str(ticket_options_reaction.emoji) in {"????", "⛔"}

                try:
                    ticket_options_reaction, ticket_options_user = await self.bot.wait_for("reaction_add", timeout=3600.0, check=ticket_options_check)
                except asyncio.TimeoutError:
                    return
                else:
                    if str(ticket_options_reaction.emoji) == "⛔":
                        await ticket_channel.delete()

                    if str(ticket_options_reaction.emoji) == "????":
                        await ticket_channel.set_permissions(ticket_creator_user, send_messages=None, add_reactions=None, read_messages=True)

                        reopened_ticket_embed_message = discord.Embed(description=f"Ticket has been reopened by {ticket_options_user.name}#{ticket_options_user.discriminator}", timestamp=datetime.datetime.now(), colour=discord.colour.Colour.green())
                        reopened_ticket_embed_message.set_footer(text=f"Created By Nexus Developments - https://discord.gg/YmdugDf", icon_url="https://i.imgur.com/MRBsIpe.png")

                        await ticket_channel.send(embed=reopened_ticket_embed_message)

    @commands.command(name="ticketmsg")
    async def send_create_ticket_msg(self, ctx, channel: discord.TextChannel = None):
        if channel is None:
            channel = ctx.message.channel

        embedMessage = discord.Embed(title="Create A Ticket", description="To create a ticket react with ????", timestamp=ctx.message.created_at, color=discord.colour.Colour.green())
        embedMessage.set_footer(text=f"Created By Nexus Developments - https://discord.gg/YmdugDf", icon_url="https://i.imgur.com/MRBsIpe.png")

        create_ticket_msg = await channel.send(embed=embedMessage)
        await create_ticket_msg.add_reaction("????")

        await ctx.message.delete()

        create_ticket_msgs_dict = await self.read_json_to_dict("create_ticket_msgs_ids.json", ctx.channel)

        create_ticket_msgs_dict[str(create_ticket_msg.id)] = ctx.guild.id

        with open("json/create_ticket_msgs_ids.json", "w") as create_ticket_msgs_json_file:
            json.dump(create_ticket_msgs_dict, create_ticket_msgs_json_file)

    @commands.command(name="close")
    async def close_ticket_command(self, ctx, channel: discord.TextChannel = None):
        if channel is None:
            channel = ctx.channel

        await self.close_ticket(ctx.channel, ctx.author, ctx.guild, channel)

def setup(bot):
    bot.add_cog(TicketSystem(bot))

如果有人想创造自己的on_reaction_add事件工作原理相同,无需任何修改,然后您可以获得如下反应和用户

@bot.event
async def on_raw_reaction_add(payload):
    message = await bot.get_channel(payload.channel_id).fetch_message(payload.message_id)
    reaction = discord.utils.get(message.reactions, emoji="????")
    user = payload.member

当然上面的代码是寻找特定的表情符号。另外,如果您想使用表情符号本身,请使用payload.emoji.name反而。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在discord.py中使用on_raw_reaction_add? 的相关文章

随机推荐

  • Cordova 插件的输出延迟

    我编写了一个 Cordova 插件来下载文件并将其保存在数据文件夹中 除了返回值之外 一切都工作正常 我想显示一个进度条并需要获取当前进度 这是我的代码中的相关部分 while readed is read buffer gt 0 fos
  • Rails CSRF 令牌 - 它们会过期吗?

    我注意到 如果您使用无效的 CSRF 令牌发帖 rails devise 会自动将您注销 我有一个不刷新页面的应用程序 用户长时间坐在实时页面上 有时用户会被踢出 我想知道 CSRF 令牌是否已过期 从而使其无效 这就是为什么我想了解 Ra
  • 从 Gradle 构建中复制 Maven“dependencyManagement”标签

    我正在尝试跟随这个 Spring Boot Vaadin 指南 https www baeldung com spring boot vaadin however我正在使用 Gradle not Maven 在该指南的最顶部 他们说使用以下
  • 在 Fortran 中执行张量积的有效方法

    我需要在 Fortran 中对一些大型数组执行一些张量积和收缩 有时它们是向量或矩阵 有时涉及的一些对象是 3 数组或 4 数组 当然 通过一些嵌套循环编写一个子例程来实现此目的非常容易 而这正是我所做的 但对于非常大的数组 我必须多次调用
  • jQuery scrolltop - 第一次使用后不起作用

    我在此菜单上使用 jQuery 滚动顶部功能 http goethesternfriseure de index php http goethesternfriseure de index php 问题是滚动功能仅在第一次起作用 第二次点击
  • 如何检查 stopCluster (R) 是否工作

    当我尝试使用 stopCluster 从工作区中删除集群时 它似乎不起作用 下面是我正在使用的代码 gt cl lt makeCluster 3 gt cl socket cluster with 3 nodes on host local
  • 在 React 中在函数内声明函数

    我刚刚遇到了一个 React 代码 我不确定这是否是一个好方法 这是该代码的示例实现 class App extends React Component renderMessage gt function getMessage return
  • 程序退出后,使curses程序输出保留在终端回滚历史记录中

    我对诅咒很陌生 所以我正在尝试 python 中的一些不同的东西 我已经初始化了窗口并为窗口对象设置了scrollok 我可以添加字符串 并且滚动可以正常工作 这样 addstr 在窗口末尾不会出现任何错误 我想要的是在程序完成后能够在终端
  • IIS URL 重写 ASP

    我尽力扫描论坛寻求帮助 以制作 web config 来重写此类 url domain com default asp id 3 language 2 我希望这可以是 domain com en service where language
  • Angular2 中的动态模板“嵌入”

    我正在努力实现这样的目标 我有一个名为的模型类ObjectTypeA ObjectTypeB and ObjectTypeC 还有一个工厂ComponentFactory 根据传入的对象类型将创建不同的组件 ComponentFactory
  • 通过代码获取文件 tnsnames.ora 的位置

    我怎样才能获得该位置tnsnames ora在安装了 Oracle 客户端的机器上按代码编写文件 Windows 注册表项是否指示该文件的位置 几年前我也遇到过同样的问题 当时我必须支持 Oracle 9 和 10 因此代码只处理这些版本
  • 访问 R data.frame 中倒数第二个值的最佳方法是什么?

    假设我有一个名为 SLV 的 data frame 并且我应用了 tail 函数 我会得到这个 gt tail SLV SLV Open SLV High SLV Low SLV Close SLV Volume SLV Adjusted
  • 致命错误:脚本超出最大执行时间 30 秒

    我有一位客户收到与脚本超时相关的错误 我已经包含了下面的代码 但我认为问题是需要延长超时 这是我可以在代码中设置的内容 还是必须由网络托管服务商 GoDaddy 设置 致命错误 D hosting 123 html siteame wp c
  • mysql 仅当用户不存在时创建用户

    我想执行一个CREATE USER语句 但仅当用户尚不存在时 这样做的最好方法是什么 如果您要创建用户 则还需要创建授权 如果用户不存在 授权会隐式创建一个用户 这就是为什么我们鼓励您在创建授权时包含密码 以防万一它们不存在 看http d
  • EF Core:使用字典属性

    有没有办法用 Entity Framework Core 填充字典属性 出于性能原因 我们喜欢在应用程序而不是数据库中进行搜索 由于列表不能很好地扩展 我们喜欢使用字典 例如 简化示例 class Course public Diction
  • console.log 的替代品?

    我想知道是否有其他方法可以在不使用控制台消息的情况下向控制台写入内容 我的项目在完成构建之前删除了所有控制台语句 但在特殊情况下 我需要找到一种通过控制台向用户显示某些内容的方法 如果没有控制台语句 这是否可能 您只能通过 Console
  • Scala 递归理解只在空列表前面添加一次,为什么?

    类似于这篇文章here https stackoverflow com questions 41471322 for comprehension in scala with recursive call 我正在学习 Scala 函数式编程
  • 如何在struts 2的s:action标签中使用ignoreContextParams属性

    在Struts 2中 有一个
  • 在 python 中连接 .m3u8 中存在的文件

    我正在尝试在 python 中连接 m3u8 播放列表中存在的 ts 文件 有什么办法可以做到吗 如果是 请解释一下如何 提前致谢 这应该可行 我只在这个简短的脚本中添加了两条注释 因为我想它几乎是不言自明的 import shutil P
  • 如何在discord.py中使用on_raw_reaction_add?

    好吧 我有一个程序 一个票务系统 它以 JSON 格式记录工单创建消息 ID 以便在程序重新启动时可以继续检查是否添加了新的反应 但我发现该消息必须加载到机器人的缓存中 但一旦重新启动 它就不会存在 所以我发现on raw reaction