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

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

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

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Python

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

Q&A

解決済

2回答

780閲覧

discord.pyで役職なしのユーザーを一括で追放したい

ngmg

総合スコア72

Discord

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Python

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

0グッド

0クリップ

投稿2022/08/26 11:32

編集2022/09/13 21:22

前提

Python、Heroku、GitHubで構成してます。
ディスコードで「!kick @moo 規約違反」と入力するとbotがユーザー「moo」を追放するdiscord.pyを作成しました。
追放するユーザーをメンションで指定しています。

実現したいこと

追放するユーザーをメンションではなく「役職なしのユーザー」にして一括で追放したいと考えておりますがどうしたらいいでしょうか?

import discord import traceback from discord.ext import commands from os import getenv bot = commands.Bot(command_prefix="!",intents=discord.Intents.all()) @bot.event async def on_command_error(ctx, error): orig_error = getattr(error, "original", error) error_msg = ''.join(traceback.TracebackException.from_exception(orig_error).format()) await ctx.send(error_msg) @bot.command() @commands.has_permissions(administrator=True) async def kick(ctx, member:discord.Member, reason): await member.kick(reason=reason) embed=discord.Embed(title="KICK", color=0xff0000) embed.add_field(name="メンバー", value=f"{member.mention}", inline=False) embed.add_field(name="理由", value=f"{reason}", inline=False) await ctx.send(embed=embed) token = getenv('DISCORD_BOT_TOKEN') bot.run(token)

ログ画像追加
イメージ説明

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

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

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

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

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

guest

回答2

0

解決済みのようですが話が止まっていると思われるので一応

  • Botにロールがない場合、BotもBanされますよ?

bot_has_any_roles()を付けたくない場合、デコレーターを消して、条件を

py

1norole_member = [member for member in ctx.guild.members if (len(member.roles) == 0 and not member.bot)]

にするべきかと。

py

1# botにロールがない場合、botもBanされてします。 2@commands.bot_has_any_role() 3@commands.bot_has_permissions(ban_members=True) 4@bot.command(name="norole", aliases=["ban"]) 5async def norole_ban(ctx: commands.Context): 6 norole_member = [member for member in ctx.guild.members if len(member.roles) == 0] 7 for member in norole_member: 8 # メンバーをban. delete引数は過去のメッセージを削除する日、reasonはその理由 9 await member.ban( 10 delete_message_days=2, 11 reason="ロールがないため" 12 ) 13 14 15@norole_ban.error 16async def norole_error(ctx: commands.Context, error): 17 if isinstance(error, commands.BotMissingAnyRole): 18 return await ctx.send("botにロールがないため実行できません") 19 20 if isinstance(error, commands.BotMissingPermissions): 21 return await ctx.send("権限がありません。") 22 23 if isinstance(error, discord.NotFound): 24 return await ctx.send("ユーザーが見つかりませんでした。") 25 26 await ctx.send(f"{error)}\nエラーが起きました。")

norole コマンドまたはbanコマンドで実行でき、エラーが発生した場合はnorole_errorに行きます。これで一応赤文字エラーは出なくなります。

投稿2022/09/12 03:35

pecop

総合スコア409

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

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

ngmg

2022/09/13 12:22

ありがとうございます。 botに対する操作は考えていなかったので勉強になります。
guest

0

ベストアンサー

Python

1norolemember = [i for i in guild.members if len(i.roles) == 1]

でロールを持ってないユーザーオブジェクトのリストが取得できます
コード例:

Python

1async def norole_ban(guild): #guildオブジェクトを渡してください 2 notolemember = [i for i in guild.members if len(i.roles) == 1] 3 for i in norolemember: 4 try: 5 await i.ban() 6 except discord.Forbidden: 7 print("権限が足りません")

投稿2022/08/26 13:30

編集2022/08/26 17:03
start

総合スコア101

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

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

start

2022/08/26 13:31

これをforで回してkickするなどして実装してみてください。
ngmg

2022/08/26 14:19

ありがとうございます。 調べてやってみます!
ngmg

2022/08/26 16:56

そのままだとエラーがおきたのでguild = bot.guilds[0]を追記しました。 if not i.rolesがない状態だとユーザーのリストをコンソールに出力することができましたがif not i.roles が付いているとnorolememberにユーザーが入ってくれませんでした。 ログの画像を質問文に追加しました。 if not i.rolesがついている方はnorolemember2としています。 返される結果が[]となっています。 ロールなしのユーザーがいることも確認しています。 @bot.event async def on_ready(): guild = bot.guilds[0] norolemember = [i for i in guild.members] norolemember2 = [i for i in guild.members if not i.roles] print("on_ready") print(discord.__version__) print(norolemember) for item in norolemember: print(item) print("on_ready") print(discord.__version__) print(norolemember2) for item in norolemember2: print(item)
start

2022/08/26 16:57

if i.roles != Trueにしてみてください。
start

2022/08/26 17:00

申し訳ございません。everyoneを考慮するのをわすれていたので、[i for i in guild.members if len(i.roles) == 1] で試してください。
ngmg

2022/08/26 17:54

ありがとうございます。こちらのコマンドでキックまでできました。 あとこの==1はどういう意味なのでしょうか?==2にしてみると誰も表示されなかったです。
ngmg

2022/08/27 03:14

わかりました。 役職なし=役職の数がeveeroneの一つだけ持ってる人ということですね。
start

2022/08/27 04:08

はい。そういうことです。
ngmg

2022/08/27 04:37

コード例のasync def norole_ban(guild)だとエラーがでてしまいました AttributeError: 'Context' object has no attribute 'members'
start

2022/08/27 15:11

guild = bot.get_guild(ギルドid)または guild = ctx.guild して norole_ban(guild)してみてください
ngmg

2022/08/28 10:24

norole_ban(ctx)だとうまくいきますがnorole_ban(guild)だとエラーがでます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問