複数のサーバーに配置する予定の不和ボットを作成しています。サーバーごとに異なるウェルカムチャネル名などがあります。ウェルカムメッセージを作成し、ボットに「welcome」というチャネルにメッセージを投稿させてみました。これでこの問題は解決しましたが、機能しませんでした。サーバーの所有者がボットに送信するチャネルIDをサーバー名/ IDで保存するデータベースを作成することを考えました。トリガーされると、ボットはサーバーIDをデータベース内のIDと照合し、サーバーIDにリンクされたチャネルIDを取得します。しかし、それはSQLまたはPostgreSQLでの多くのコーディングであり、ボットにサーバーIDとチャネルIDをデータベースに保存させる方法、ボットをサーバーIDと一致させてから、チャネルIDを取得する方法を学ぶ必要があります。そしてそれをサーバーにメッセージを投稿します。不和なボットやさまざまなサーバーへのウェルカムメッセージの作成に関するドキュメントはありません。私はそれを行うためのより良い方法があるかどうか、そしてどのようにそれを行うのか疑問に思いましたか?
ウェルカムメッセージに関して私がこれまでに持っていること。
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を入力することだけです。
ボットの規模がはるかに小さい場合、たとえばサーバーが数台しかない場合は、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ファイルがあることを確認{}
し、ファイルに追加してください
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加