random_team Bot
ランダムにチーム分けをするDiscord Bot
https://cdn.discordapp.com/attachments/533369395465027586/601443308568313876/unknown.png
仕様としては、コマンド(!rt)とチーム数を受け取り、コマンドを打った人が参加しているVoiceChannelのメンバーでチーム分けをする。
使った言語はDartで、nyxxというDiscrod APIのwrapper Packageを使った。 チームが割り切れない場合どうするかかなり悩んだだが、潔く余った人を補欠にして判断はその状況に任せることにした。
code:random_team.dart
Map<String, List<String>> getRondomTeam(int teamNum) {
int fill = players.length % teamNum;
Map<String, List<String>> teams = {};
teamNameList.shuffle();
teamNameList.add('😇 sub');
players.shuffle();
int peoplePerTeam = players.length ~/ teamNum;
teamNameList.take(teamNum).toList().asMap().forEach(
(i, teamName) =>
teamsteamName = players.sublist(i * peoplePerTeam, i * peoplePerTeam + peoplePerTeam)); teams'😇 sub' = players.sublist(players.length - fill, players.length); return teams;
}
ふと書いてて思ったけど、
teams[teamName] = players.sublist(i * peoplePerTeam, i * peoplePerTeam + peoplePerTeam));
は
teams[teamName] = players.skip(i * peoplePerTeam).take(peoplePerTeam);
でいいんじゃないか?明示的でわかりやすいし。
Embedの作成はEmbedBuilderというコンストラクターを使って作成できる。
code: embed_builder.dart
EmbedBuilder embed = (EmbedBuilder()
..title = "random team"
..color = DiscordColor.fromInt(13369286));
randomTeam.forEach((key, value) => embed.addField(
name: key,
content: value.isNotEmpty ? ' ' + value.join(', ') : '👻',
inline: true));
ここでの注意点は、embed.addField()のcontentにcontent: ''のような空文字だったりを渡すとエラーも吐かずにEmbedは表示されないので何かしら入れてあげるかvalue.isNotEmptyの場合にaddField()するなどにしてあげればいい。(上記コードの場合可愛いからGhostにしているが、ゼロ幅スペースでもいいんかな?)
チーム名はガルパンになぞって用意しようかと思ってたけど、あんこうの絵文字がなかったので、仕方なくなんかそれっぽい動物の絵文字にすることにした。 [ '🐯 team', '🦍 team', '🦅 team', ...]こんな感じのリストを用意して
code: random_team.dart
teamNameList.shuffle();
teamNameList.add('😇 sub');
でなんとなくチーム名も毎回ランダムにした。ちなみにsubは補欠でリストの最後に追加している。
code:random_team.dart
teamNameList.take(teamNum).toList().asMap().forEach(
(i, teamName) => teamsteamName = players.sublist(i * m, i * m + m)); teams'😇 sub' = players.sublist(players.length - fill, players.length); 用意しているチーム名よりも多いいチーム数で実行されると、補欠にも割り当てられちゃうことに気づいた。結局チームを割り当てたあとにkey('😇 sub')で補欠に割り当てているのでteamNameList.add('😇 sub');はいらなかったw