多台服务器的Discord.py欢迎消息

时间:2020-06-30 22:47:49

标签: python-3.x discord discord.py

我正在制作一个计划在多台服务器中使用的不和谐机器人。每个服务器将具有不同的欢迎频道名称以及所有其他名称。我发出了欢迎消息,并尝试使机器人在称为“欢迎”的频道中发布该消息,这可以解决此问题,但不起作用。我考虑过要创建一个数据库,该数据库在服务器名称/ ID下保存服务器所有者发送给机器人的通道ID。机器人在触发时会将服务器ID与数据库中的ID匹配,然后获取链接到服务器ID的通道ID。但这将需要大量的SQL或PostgreSQL编码,我将不得不学习如何使机器人将服务器ID和通道ID保存到数据库中,如何使机器人与服务器ID匹配然后获取通道ID。并将其发布到服务器。没有关于不合格的py机器人以及针对不同服务器发出欢迎消息的文档。我想知道是否有更好的方法来做,我将如何做?

到目前为止,我对欢迎信息的了解。


import discord
import logging
import asyncio
import random
import time
import tweepy, discord

from discord.ext import commands
from discord.ext.commands import bot

#File Imports
from config import *


client = commands.Bot(command_prefix='sec.')

# logger = logging.getLogger('discord')
# logger.setLevel(logging.DEBUG)
# handler = logging.FileHandler(filename='discord.log', encoding='utf-8', mode='w')
# handler.setFormatter(logging.Formatter('%(name)s: %(message)s'))
# logger.addHandler(handler)

@client.event
async def on_ready():
    print('Logged in as %s' % client.user.name)
    while True:
        presence = random.choice(['sec.help', 'Defending Servers'])
        activity = discord.Game(name=(presence))
        await client.change_presence(status=discord.Status.online, activity=activity)
        await asyncio.sleep(7)

client.remove_command('help')

@client.event
async def on_member_join(member):
    # Adds role to user
    # role = discord.utils.get(member.server.roles, name='Member')
    # await client.add_roles(member, role)

    # Random embed color
    range = [255,0,0]
    rand = random.shuffle(range)

    # Welcomes User
    embed = discord.Embed(title="{}'s info".format(member.name), description="Welcome too {}".format(member.guild.name))
    embed.add_field(name="Name", value=member.name, inline=True)
    embed.add_field(name="ID", value=member.id, inline=True)
    embed.add_field(name="Status", value=member.status, inline=True)
    embed.add_field(name="Roles", value=member.top_role)
    embed.add_field(name="Joined", value=member.joined_at)
    embed.add_field(name="Created", value=member.created_at)
    embed.set_thumbnail(url=member.avatar_url)
    inlul = client.get_channel(CHANNEL_ID)

    await inlul.send(inlul, embed=embed)

如果您找到有关此文档的任何文档,请阅读。我所能找到的都是基本的机器人,您需要输入频道ID。

1 个答案:

答案 0 :(得分:0)

如果该机器人规模较小,仅说几台服务器,那么我会说使用json文件保存字典并不是一个坏主意。

当服务器加入服务器时,您可以将顶部文本通道的ID保存为默认值,并让他们更改要使用命令的通道,这可以通过on_guild_join事件来完成

import json

#sets value in json to guild id upon the bot joining the guild
@client.event
async def on_guild_join(guild):
    #loads json file to dictionary
    with open("filename.json", "r") as f:
        guildInfo = json.load(f)

    guildInfo[guild.id] = guild.text_channels[0] #sets key to guilds id and value to top textchannel
    
    #writes dictionary to json file
    with open("filename.json", "w" as f:
        json.dump(guildInfo, f)

#allows server members to set channel for welcome messages to send to    
@client.command()
async def welcomeMessage(ctx):
    with open("filename.json", "r") as f:
        guildInfo = json.load(f)

    guildInfo[ctx.message.guild.id] = ctx.message.channel.id #sets channel to send message to as the channel the command was sent to

    with open("filename.json", "w") as f:
        json.dump(guildInfo, f)

然后只用

with open("filename.json", "r"):
    guildInfo = json.load(f)

channnel = guildInfo[ctx.message.guild.id]

获取将消息发送至和的渠道

channel.send(embed=embed)

发送消息

在运行它之前,请确保在同一目录中有一个空的json文件,并将{}添加到该文件中