【问题标题】:Discord.py Variables specific to Server特定于服务器的 Discord.py 变量
【发布时间】:2020-12-24 07:28:10
【问题描述】:

我制作了一个机器人,它在执行命令后赋予人员角色。

现在我想添加一个命令,将它赋予人们的角色更改为你喜欢的任何角色。

当我在执行如下命令后更改变量时:

@client.command()
async def changeStuff(ctx, now):
    global test
    test = now

    await ctx.send("changed")

在我的其他测试服务器上检查后它也会发生变化:

@client.command()
async def checkStuff(ctx):
    await ctx.send(test)

这当然是有道理的,因为它是相同的脚本。但是有没有办法让它特定于每个服务器?

【问题讨论】:

  • 也许把它保存在像{"server1": now, "server2": other}这样的字典里,然后你需要一些if/else
  • 是的,我会使用服务器 ID,谢谢你的想法!

标签: python discord discord.py global


【解决方案1】:

我发现了自己:

这是将信息保存到 Dict 和 Json 文件的代码(将其保存为 storage.py 以保持机器人正常工作)

import json


replist = {}

def Handle(Name, action, varname = None, data = None):
  if action == "add":
    o = checkInfo(Name, varname)
    if o == "Error":
      addentry(Name)
      addInfo(Name, varname, data)
    else:
      addInfo(Name, varname, data)
  elif action == "check":
    o = checkInfo(Name, varname)
    if o == "Error":
      return "User doesnt exist in database"
    else:
      return o
    


def savetojson(dict):
   with open('varStorage.json', 'w') as fp:
      json.dump(dict, fp)

def loadfromjson():
  try:
    with open('varStorage.json') as json_file: 
      global replist
      replist = json.load(json_file)
  except json.decoder.JSONDecodeError:
    addentry("Placeholder")


def addInfo(Name, varN, data):
  loadfromjson()
  if Name in replist:

      replist[Name][varN] = data
      savetojson(replist)
  else:
    return "Error"


def checkInfo(Name, varN):
  loadfromjson()
  try:
    return replist[Name][varN]
  except:
    return "Error"

    



def addentry(Name):
  replist[Name] = {}
  savetojson(replist)
  return "done"

您可以像这样在您的机器人(或其他任何地方)中调用它:

import discord, discord.utils
from discord.utils import get
from discord.ext import commands
import storage

client = commands.Bot(command_prefix= "+")

@client.event
async def on_ready():
    print("Ready!")

@client.command()
async def changeStuff(ctx, name, data):
    name = str(name)
    data = str(data)
    
    gid = ctx.guild.id
    gid = str(gid)

    storage.Handle(gid, "add", name, data)

    await ctx.send("changed")

@client.command()
async def checkStuff(ctx, tocheck):
    gid = ctx.guild.id
    gid = str(gid)
    outl = storage.Handle(gid, "check", tocheck)

    await ctx.send(outl)

client.run("yourToken")

第一部分来自我不久前制作的一个机器人:https://github.com/Lulonaut/Discordrepbot/blob/master/Functions/storage.py(稍作修改)

希望这对某人有所帮助,即使没有,至少它对我有所帮助:D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 2021-05-30
    • 2021-01-06
    • 2019-05-30
    • 1970-01-01
    • 2021-10-27
    • 2017-02-09
    相关资源
    最近更新 更多