Skip to content

Instantly share code, notes, and snippets.

@yhay81
Created March 3, 2019 14:16
Show Gist options
  • Save yhay81/764f1b70f9646a8997b832b8b2db5971 to your computer and use it in GitHub Desktop.
Save yhay81/764f1b70f9646a8997b832b8b2db5971 to your computer and use it in GitHub Desktop.
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