質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1954閲覧

Discord.pyのButtonを使用し、特定のButtonを管理者権限を持っている人だけを押せるようにするには

Winter_1214

総合スコア11

Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/05/31 09:14

編集2021/05/31 11:38

前提・実現したいこと

buttonを使用して数字をカウントアップしていき、最後のEnterを押して足し算する。
※Enterを管理者権限を持っている人だけが押せるようにしたい。

該当のソースコード

python

1import asyncio 2import discord 3from discord.ext import tasks,commands 4from discord_components import DiscordComponents, Button, ButtonStyle, InteractionType 5import datetime 6 7client = commands.Bot(command_prefix = '_') 8 9ddb = DiscordComponents(client) 10 11tasu=[[ 12 Button(style=ButtonStyle.red, label="1"), 13 Button(style=ButtonStyle.red,label="2"), 14 Button(style=ButtonStyle.red,label="3"), 15 Button(style=ButtonStyle.gray, label="Enter"), 16 Button(style=ButtonStyle.gray, label="Cancel") 17 ]] 18 19@client.command() 20@commands.has_permissions(administrator=True) 21async def pura(ctx): 22 Voting1 = Voting2 = Voting3 = pura = 0 23 now = datetime.datetime.now() 24 delta = datetime.datetime.now()+ datetime.timedelta(minutes=5) 25 embed = discord.Embed(title="",description='足し算\n' + str(Voting1) + "+" + str(Voting2) + "+" + str(Voting3) + "=" + str(pura),color=0xff0000,timestamp=now) 26 m = await ctx.send(embed=embed,components=tasu, type=7) 27 while m.created_at < delta: 28 res = await client.wait_for("button_click") 29 role = ctx.guild.get_role("管理者のrole_id") 30 #ここで管理者権限を持っている人だけEnterを押せるようにしたい。 31 def check(res): 32 return ctx.author == res.user and res.channel == ctx.channel and res.role == role 33 34 ent = await client.wait_for("button_click",check=check) 35 pura = VotingB + VotingK + VotingW 36 print(str(role) + 'aaaaaaa') 37 if res.component.label == "1": 38 Voting1 += 1 39 if res.component.label == "2": 40 Voting2 += 1 41 if res.component.label == "3": 42 Voting3 += 1 43 if ent.component.label == "Enter": 44 pura = Voting1 + Voting2 + Voting3 45 else: 46 await res.respond(content="あなたは権限を持っていません。") 47 if res.component.label == "Cancel": 48 await res.respond(content="終了します。") 49 break 50 embed = discord.Embed(title="",description='足し算\n\n結果:' + str(pura),color=0xff0000,timestamp=now) 51 await res.respond(embed=embed,components=tasu,type=7)

試したこと

wait_forがあると聞いて試してみたが、動かなかった。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

udon-ken

2021/05/31 10:42

> 動かなかった。 ではわかりませんので、どのように動かなかったか具体的に示して下さい。 また、提示のコードはどの段階のものでしょうか? ・「管理者権限を持っている人だけが押せる」以外の機能は正常に動くもの ・上記コードに「管理者権限を持っている人だけが押せる」機能を足したため動かなくなったもの(この場合、どの部分を変更したか明示していただいた方がわかりやすいです)。
Winter_1214

2021/05/31 11:40

すみません。説明が下手で.... 後者のほうですね。「管理者権限を持っている人だけがおせる」を追加しようとしたら、 「インタラクションに失敗しました」と出るようになりました。 あとは、Contextにroleはないよって言われていますね。
guest

回答1

0

ベストアンサー

実際にやってないので正確ではないかもしれませんが・・・
しかもdiscord_componentのドキュメント大幅修正中なのかな・・・よく分からない。。
ま、いいとして、

res = await client.wait_for("button_click")

このresdiscord.pyのuserオブジェクトを属性として持っているようですので、res.userで取り出せそうですが、これはおそらく文字通りuserオブジェクトと思います。
そして、このuserが管理権限を持っているかどうか調べればいいのですが、当然「当該ギルドについての管理権限」を調べる必要がありますが、userオブジェクトはそもそもギルド情報を持ちませんのでそのままでは無理です。

しかし、resguildオブジェクトも属性として持っている(res.guild)ようなので、ここまでで分かっているuserのidguildオブジェクトを使ってguild.get_member()memberオブジェクトを取得します。

memberオブジェクトが取得できたら、memberguild_permissionsadministratorTrueなら管理権限がある事になりますし、無ければFalseです。

管理権限の有無を好きな方で判定して管理権限が無い場合の処理、有る場合の処理をそれぞれ記述すればいいと思います。

正常動作しているものにent=あたりのコードを追加したそうですが、これはおそらく不要です。

投稿2021/05/31 23:50

編集2021/05/31 23:57
udon-ken

総合スコア657

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Winter_1214

2021/06/01 12:56

1から10まで細かく説明して頂きありがとうございます。 udon-kenさんの手順通りにプログラムを組むと正常に動き、 私がしたかった通りのコードを書くことができました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問