Created
March 3, 2019 14:16
-
-
Save yhay81/764f1b70f9646a8997b832b8b2db5971 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sqlite3 | |
import random | |
import discord | |
client = discord.Client() | |
conn = sqlite3.connect("recruit.db") | |
@client.event | |
async def on_ready(): | |
print('Logged in as') | |
print(client.user.name) | |
print(client.user.id) | |
print('------') | |
await client.change_presence(game=discord.Game(name="discha.net", url="https://discha.net")) | |
@client.event | |
async def on_server_join(server): | |
return await rec_man(server.default_channel) | |
@client.event | |
async def on_message(message): | |
if not message.content.startswith('!'): return | |
if not message.content[1] in ['募', '参', 'e', 's', 'r', 'u']: return | |
if message.content == '!募集くん': | |
return await rec_man(message.channel) | |
if message.content == '!募集キャンセル': | |
return await rec_cancel(message) | |
if message.content == '!募集締め切り' or message.content == '!end': | |
return await rec_end(message) | |
if message.content.startswith('!募集') or message.content.startswith('!start'): | |
return await rec_start(message) | |
if message.content == '!参加' or message.content == '!r': | |
return await rec_join(message) | |
if message.content == '!参加キャンセル' or message.content == '!ur': | |
return await rec_join_cancel(message) | |
# CREATE TABLE recruit_status(channel_id integer, rec_num integer, team_num integer, admin_name string, admin_id integer, title string) | |
# CREATE TABLE recruit_member(channel_id integer, member_id integer, member_name string); | |
async def rec_man(channel): | |
return await client.send_message( | |
channel, | |
"""使えるコマンド: | |
募集するとき: | |
!募集 [人数] | |
!募集 [人数] [タイトル] | |
!募集 [人数] [チーム数] | |
!募集 [人数] [チーム数] [タイトル] | |
(!startでも可) | |
キャンセルするとき: | |
!募集キャンセル | |
途中で締め切るとき: | |
!募集締め切り | |
参加するとき: | |
!参加 | |
(!rでも可) | |
参加をキャンセルするとき: | |
!参加キャンセル | |
(!urでも可) | |
ヘルプを見るとき: | |
!募集くん""" | |
) | |
async def rec_start(message): | |
recruit_message = message.content.split(" ") | |
recruit_status = conn.execute("SELECT * FROM recruit_status WHERE channel_id=?", | |
(message.channel.id,)).fetchone() | |
if recruit_status: | |
return await client.send_message(message.channel, "現在行われている募集があります。\nキャンセルは:\n!募集キャンセル") | |
if len(recruit_message) < 2 or (recruit_message[0] != "!募集" and recruit_message[0] != "!start") or \ | |
not recruit_message[1].isdigit() or int(recruit_message[1]) <= 0: | |
return await client.send_message( | |
message.channel, | |
"正しく入力してください。\n募集するには\n!募集 [人数] [チーム数(オプション)] [タイトル(オプション)]" | |
) | |
team_num = int(recruit_message[2]) if len(recruit_message) >= 3 and recruit_message[2].isdigit() else 0 | |
title = "" | |
if len(recruit_message) >= 4: | |
title = recruit_message[3] | |
if len(recruit_message) >= 3 and not recruit_message[2].isdigit(): | |
title = recruit_message[2] | |
conn.execute("insert into recruit_status values( ?, ?, ?, ?, ?, ?)", | |
[message.channel.id, recruit_message[1], team_num, message.author.name, message.author.id, title] | |
) | |
conn.commit() | |
head = '"{}"'.format(title) if title else "" | |
await client.send_message(message.channel, "{}参加者募集開始!あと{}人!".format(head, recruit_message[1])) | |
head = "[{}]の".format(title) if title else "" | |
return await client.send_message(message.author, "{0}募集を開始しました。".format(head)) | |
async def rec_join(message): | |
recruit_status = conn.execute("SELECT * FROM recruit_status WHERE channel_id=?", (message.channel.id,)).fetchone() | |
if not recruit_status: | |
return await client.send_message( | |
message.channel, | |
"現在行われている募集はありません。\n募集するには\n!募集 [人数] [チーム数(オプション)] [タイトル(オプション)]" | |
) | |
recruit_members = conn.execute("SELECT * FROM recruit_member WHERE channel_id=?", | |
(message.channel.id,)).fetchall() | |
rest = int(recruit_status[1]) - len(recruit_members) - 1 | |
conn.execute("insert into recruit_member values( ?, ?, ? )", | |
[int(message.channel.id), message.author.id, message.author.name] | |
) | |
conn.commit() | |
if rest > 0: | |
head = '"{}"'.format(recruit_status[5]) if recruit_status[5] else "" | |
return await client.send_message(message.channel, "{}参加者募集中!あと{}人!".format(head, rest)) | |
else: | |
return await rec_finish(message, recruit_status) | |
async def rec_join_cancel(message): | |
join = conn.execute("select 0 from recruit_member where channel_id=? and member_id=?", | |
(message.channel.id, message.author.id) | |
) | |
if not join: | |
return await client.send_message(message.channel, "参加登録はありません") | |
conn.execute("delete from recruit_member where channel_id=? and member_id=?", | |
(message.channel.id, message.author.id)) | |
conn.commit() | |
return await client.send_message(message.channel, "この参加をキャンセルしました") | |
async def rec_end(message): | |
recruit_status = conn.execute("SELECT * FROM recruit_status WHERE channel_id=?", | |
(message.channel.id,)).fetchone() | |
if not recruit_status: | |
return await client.send_message( | |
message.channel, | |
"現在行われている募集はありません。\n募集するには\n!募集 [人数] [チーム数(オプション)] [タイトル(オプション)]" | |
) | |
return await rec_finish(message, recruit_status) | |
async def rec_cancel(message): | |
recruit_status = conn.execute("SELECT * FROM recruit_status WHERE channel_id=?", | |
(message.channel.id,)).fetchone() | |
if not recruit_status: | |
return await client.send_message( | |
message.channel, | |
"現在行われている募集はありません。\n募集するには\n!募集 [人数] [チーム数(オプション)] [タイトル(オプション)]" | |
) | |
conn.execute("delete from recruit_status where channel_id=?", (message.channel.id,)) | |
conn.execute("delete from recruit_member where channel_id=?", (message.channel.id,)) | |
conn.commit() | |
await client.send_message(message.channel, "このチャンネルの募集をキャンセルしました") | |
head = "[{}]の".format(recruit_status[5]) if recruit_status[5] else "" | |
return await client.send_message( | |
discord.utils.get(client.get_all_members(), id=str(recruit_status[4])), | |
"{0}募集を、{1}がキャンセルしました。".format(head, message.author.name)) | |
async def rec_finish(message, recruit_status): | |
recruit_members = conn.execute("SELECT * FROM recruit_member WHERE channel_id=?", (message.channel.id,)).fetchall() | |
conn.execute("delete from recruit_status where channel_id=?", (message.channel.id,)) | |
conn.execute("delete from recruit_member where channel_id=?", (message.channel.id,)) | |
conn.commit() | |
team_num = recruit_status[2] | |
announce = "{}の募集終了!\n".format("<@{}>".format(recruit_status[4])) | |
if team_num == 0: | |
announce += '"{}"の参加者一覧:\n- '.format(recruit_status[5]) if recruit_status[5] else "参加者一覧:" | |
announce += "\n- ".join("<@{}>".format(member[1]) for member in recruit_members) | |
else: | |
member_ids = [member[1] for member in recruit_members] | |
random.shuffle(member_ids) | |
all_member_count = len(member_ids) | |
syou = all_member_count // team_num | |
amari = all_member_count % team_num | |
announce += '"{}"の参加者・チーム一覧:'.format(recruit_status[5]) if recruit_status[5] else "参加者・チーム一覧:" | |
team_wake = [syou for _ in range(team_num)] | |
for i in range(amari): | |
team_wake[i] += 1 | |
team_name = 1 | |
for group_nai in team_wake: | |
announce += "\nチーム[{}]".format(team_name) | |
team_name += 1 | |
for i in range(group_nai): | |
announce += "\n- {}".format("<@{}>".format(member_ids.pop())) | |
await client.send_message(message.channel, announce) | |
head = "[{}]の".format(recruit_status[5]) if recruit_status[5] else "" | |
return await client.send_message( | |
discord.utils.get(client.get_all_members(), id=str(recruit_status[4])), | |
"{0}募集が終了しました。\n\n{1}".format(head, announce)) | |
client.run('') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment