-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbot.py
115 lines (98 loc) · 3.54 KB
/
bot.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/usr/bin/env python3
import discord
from discord.ext import commands
import asyncio
import re
import os
import sqlite3
from contextlib import closing
# About Discord
TOKEN = os.getenv("DISCORD_TOKEN", "")
OWNER = os.getenv("DISCORD_OWNER", "")
# About DB
DBNAME = 'database.db'
TABLE = 'list'
DIR = os.path.dirname(os.path.abspath(__file__)) + '/'
MAX_LENGTH = 1000
description = '''買い物リストを1日に1回送信するBotです。'''
bot = commands.Bot(command_prefix='!', description=description)
@bot.event
async def on_ready():
print('Logged in as')
print(bot.user.name)
print(bot.user.id)
print('-----')
### <retrun> コマンドの判定(boolean)
def command_validate(ctx):
return not bot.user == ctx.message.author and ctx.message.author.id == OWNER
@bot.command()
@commands.check(command_validate)
async def add(messages: str = None):
"""
引数に与えられた品目をデータベースへ追加します。
すでに同じ品目が存在した場合は、上書きされることなく多重追加されます。
個数など、細かな指定は__***できません***__。
"""
if messages == None:
await bot.say("[Error] 品目を入力してください。")
return
if len(messages) > MAX_LENGTH:
await bot.say("[Error] 文字数をオーバーしています。")
return
try:
with closing(sqlite3.connect(DIR + DBNAME)) as conn:
c = conn.cursor()
sql = 'INSERT INTO ' + TABLE + ' (item) VALUES (?)'
c.execute(sql, (messages,))
conn.commit()
await bot.say("追加しました。")
except Exception as e:
await bot.say("エラーが発生しました。\n{e}".format(**locals()))
@bot.command()
@commands.check(command_validate)
async def remove(id: int = None):
"""
引数に与えられたIDの品目をデータベースから削除します。
IDについては、!list コマンドを用いて確認してください。
"""
if id == None:
await bot.say("[Error] IDを入力してください。")
return
try:
with closing(sqlite3.connect(DIR + DBNAME)) as conn:
c = conn.cursor()
sql = 'SELECT * FROM ' + TABLE + ' WHERE id=?'
c.execute(sql, (id,))
res = c.fetchone()
item = res[1]
sql = 'DELETE FROM ' + TABLE + ' WHERE id=?'
c.execute(sql, (id,))
conn.commit()
await bot.say("ID {id}\t{item} を削除しました。".format(**locals()))
except Exception as e:
await bot.say("エラーが発生しました。\n{e}".format(**locals()))
return
@bot.command()
@commands.check(command_validate)
async def list():
"""
次にメールが送信されるときに連絡される品目とそのIDを表示します。
すでに送信済みの品目や、削除済みの品目については表示されません。
"""
try:
with closing(sqlite3.connect(DIR + DBNAME)) as conn:
c = conn.cursor()
sql = 'SELECT * FROM ' + TABLE
c.execute(sql)
res = c.fetchall()
if len(res) < 1:
await bot.say("登録されている品目はありません。")
else:
m = "時刻\tID\t品目\t\n"
for row in res:
m += "{0}\t{1}\t{2}\n".format(row[2], row[0], row[1])
await bot.say(m)
except Exception as e:
await bot.say("エラーが発生しました。\n{e}".format(**locals()))
return
bot.run(TOKEN)