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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

2498閲覧

discord.pyでユーザー別にニックネームの数字を特定のコマンドによって操作したい

natuR

総合スコア0

Discord

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/07/14 05:30

### discord.pyでユーザー別にニックネームの数字を特定のコマンドによって操作したい

数日前からプログラミングを始めたばかりの初心者です。
discordで使用するBOTを作成しています。
今回実装したい機能として、ニックネームの後ろに「@3」を"入力"とチャットに書き込んだ際に、そのユーザーの「@3」を「@2」へと書き換え、もう一度"/入力"を書き込むと「@1」「@0」とカウントを下げていく、という機能を実装したいと思っています。
現状だとカウントを2にすることしかできず、カウントをリストではなく数字のみの変数に置き換えて反応するたびに-1を行わせると、当然ながらユーザー別に設定できていないため、下がったままの値が次に入力した人に反映されてしまいます。

なので、ユーザー別に固有の値を割り当て、"/入力"を行ったユーザーを判別できるようにすればうまく行くのだろう、というところまでで躓いてしまい、どのように書き換え始めればよいのかすらわからない状態です。
どなたかご教授いただければ幸いです。

該当のソースコード

python3

1import discord 2 3ROLE_ID = "役職ID" 4 5c = 0 6# 自分のBotのアクセストークンに置き換えてください 7TOKEN = 'アクセストークン' 8 9# 接続に必要なオブジェクトを生成 10client = discord.Client() 11# 起動時に動作する処理 12@client.event 13async def on_ready(): 14 print('ログインしました') 15 16# メッセージ受信時に動作する処理 17@client.event 18async def on_message(message): 19 20#イベント全体の共通変数 21 global c #フラグ管理用変数 22 global lunch_role  #ロールID用変数 23 global member_name #ロールID一致のリスト 24 global t       #操作したい数字の種類のリスト 25 26 # メッセージ送信者がBotだった場合は無視する 27 if message.author.bot: 28 return 29 30 if message.content == '/開始': 31 if c == 0: 32 c = c + 1 33 lunch_role = message.guild.get_role(ROLE_ID) #ロールIDを取得 34 member_name = list(set(lunch_role.members)) #ロールIDの一致したメンバーをリスト化 35 t = [3,2,1,0] #使用する数字のリスト 36 await message.channel.send("開始しました") 37 i = 0 #条件ループにより一人ずつ@3を付与 38 while i <= 2: 39 await member_name[i].edit(nick=str(member_name[i].name)+ "@" + str(t[0])) 40 i = i + 1 41 else:#すでに起動済みなら 42 await message.channel.send("すでに起動しています") 43 44 if message.content == '/入力': 45 if c == 1: 46 await message.author.edit(nick=str(message.author.name) + "@" + str(t[1])) 47 await message.channel.send("入力が完了しました") 48 49

試したこと

if message.content == '/開始': if c == 0: c = c + 1 lunch_role = message.guild.get_role(ROLE_ID) #ロールIDを取得 member_name = list(set(lunch_role.members)) #ロールIDの一致したメンバーをリスト化 t = 3 #使用する数字のリスト await message.channel.send("開始しました") i = 0 #条件ループにより一人ずつ@3を付与 while i <= 2: await member_name[i].edit(nick=str(member_name[i].name)+ "@" + str(t[0])) i = i + 1 else:#すでに起動済みなら await message.channel.send("すでに起動しています") if message.content == '/入力': if c == 1: await message.author.edit(nick=str(message.author.name) + "@" + str(t - 1)) await message.channel.send("入力が完了しました") t = t - 1

補足情報(FW/ツールのバージョンなど)

python3.8.3
pip 2.1.1
discord.py

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

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

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

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

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

guest

回答1

0

えーと...
言いたいことが山ほどあるのですが、for文わかりますか?
Python初めたばかりと書いていますが、始めたばかりならdiscord.py扱う前にの話を書いておきます
(回答となるものも添付しておきます)

東京スカイツリーの最下層は太くてしっかりとしていますよね?
つまり、基礎がしっかり固まってる状態にあってあそこまで安定しているんです
ですが、このコードだけを見た限り、あなたはまだ基礎工事が終わっていない段階にあると考えます
もし、このままビルを建てても不安定で、居心地の悪いものでしょう。
早まらず地盤をしっかり固めることがとても重要なのです。
スカイツリーが上に行くにつれどんどん細くなっていき、最初より、早く工事が進むというところも同じで
基礎知識を身に着ければ身につくだけどんどん成長が早くなります。
基礎工事はコンクリートを流し込んでは固めの繰り返しです。
結局何を伝えたいのか?
Pythonを始めて一番最初にすべきなのは、discordのBotを作ることではなく、
FizzBuzz問題を如何に効率的に解くか?などコンソール上で動くものから始めて、
エラーが出たら調べて繰り返す。そして、どうしても分からないときはサイトを頼るがいいと思います
このエラー内容はここがいけないんだ!と初歩的なエラーはすぐにわかるまで行ってはじめてアプリ開発や、ツールの開発に移るという手順を踏まないと、コピペばかりになり、成長は必ずといていいほどしないでしょう

とりあえず如何に原因となりうるもの、参考にしてほしいものまとめておきます。
変数について

  • True/Falseについて調べましょう
  • 変数名はわかりやすくしましょう
  • global変数は使いすぎたらよくないことしかないです。

え?って思ったところ

  • そこwhileほんとに使うところなのか
  • lunch_roleに入ってるのロールID(int)なのか
  • listにlistは...

Pythonの基礎知識固めなくてもいいからBot開発続けたい!って 思うなら
API refarenceで返される型を確認したり、パラメータを確認したりしましょう
いや、Pythonの知識いりますねrefarence読むのにも

投げ出さずBot開発を3~4か月間せずに、Pythonの勉強したら見える世界がまるで変わります。

投稿2020/07/29 08:04

Hyugopython

総合スコア150

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問