Created
November 28, 2018 06:52
-
-
Save shiumachi/f1f526a38538ff9ccc66e9cb400bf3c3 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
# -*- coding: utf-8 -*- | |
import hypchat | |
import ConfigParser | |
import time | |
import random | |
import re | |
import sqlite3 | |
# 設定のロード | |
config = ConfigParser.RawConfigParser() | |
config.read("config.ini") | |
TOKEN = config.get("account", "token") | |
ENDPOINT = config.get("account", "endpoint") | |
ENG_ROOM_ID = config.get("room", "eng_room_id") | |
DB_PATH = config.get("db", "path") | |
# hipchat への接続 | |
hc = hypchat.HypChat(TOKEN, endpoint=ENDPOINT) | |
room = hc.get_room(ENG_ROOM_ID) | |
# DB への接続 | |
conn = sqlite3.connect(DB_PATH) | |
cursor = conn.cursor() | |
# ハードコード設定 | |
# hipchat へのアクセスインターバル(秒)。これより短くするとアクセス制限かかる | |
INTERVAL = 3 | |
# グローバル変数 | |
responded_flag = 0 | |
prev_message = None | |
members = [] | |
def get_latest_message(room): | |
''' チャット部屋から最新のメッセージを取得する | |
''' | |
m = room.history(maxResults=1) | |
return m['items'][0]['message'] | |
# bot コマンドは文頭に '!' がついたときのみ発動する | |
# 文中に 'bot' が含まれている場合、bot が返信する | |
r_bot_call = re.compile('^!.*bot.*') | |
# bot の返信一覧。 TODO: sqlite に保存する | |
bot_call_responses = [u'呼んだ?' | |
] | |
len_bot_call_responses = len(bot_call_responses) | |
def respond_to_bot_call(): | |
msg = bot_call_responses[random.randint(0, len_bot_call_responses - 1)] | |
room.message(msg) | |
# {yesno} が含まれている場合に「はい」「いいえ」を回答する | |
r_yesno = re.compile(u'^!.*\{yesno\}.*') | |
bot_yesno = [u'はい', u'いいえ'] | |
def respond_to_yesno(): | |
msg = bot_yesno[random.randint(0, len(bot_yesno) - 1)] | |
room.message(msg) | |
# get key とすると、key に対応する value を出力する。 | |
r_get = re.compile(u'^!get\W(.*)') | |
def get_value(key): | |
cursor.execute("SELECT value FROM bot_kvs WHERE key = '" + key + "'") | |
for row in cursor: | |
return row[0] | |
def respond_to_get(key): | |
print("key=" + key) | |
msg = get_value(key) | |
room.message(msg, format='text') | |
# put key value とすると、key / value を挿入する。 | |
r_put = re.compile(u'^!put\s(\S*)\s(\S*)') | |
def put_value(key, value): | |
cursor.execute(u"INSERT INTO bot_kvs(key, value) VALUES ('" + key + "', '" + value + "')") | |
return | |
def respond_to_put(key, value): | |
try: | |
put_value(key, value) | |
except: | |
print("input error: key=" + key + ", value=" + value) | |
return | |
print("put ok: key=" + key + ", value=" + value) | |
return | |
# {member} が含まれている場合に、メンバーの名前をランダム表示する。 | |
r_member = re.compile(u'^!.*\{member\}.*') | |
def respond_to_member(): | |
msg = members[random.randint(0, len(members) - 1)] | |
room.message(msg) | |
# 初期化処理 | |
def init(): | |
# メンバー一覧の初期化 | |
members_url = ENDPOINT + '/v2/room/' + ENG_ROOM_ID + '/member' | |
for user in hc.fromurl(members_url)['items']: | |
members.append(user['name']) | |
# メイン処理 | |
init() | |
while True: | |
time.sleep(INTERVAL) | |
latest_message = get_latest_message(room) | |
# prev_message の初期化 | |
if prev_message is None: | |
prev_message = latest_message | |
# 新しいメッセージが書きこまれた場合、返信済みフラグを初期化 | |
if prev_message != latest_message: | |
responded_flag = 0 | |
# 返信済みフラグが立っておらず、新しいメッセージが書きこまれている場合にコマンド発動 | |
if responded_flag == 0 \ | |
and prev_message != latest_message: | |
if r_bot_call.match(latest_message): | |
respond_to_bot_call() | |
responded_flag = 1 | |
if r_yesno.match(latest_message): | |
respond_to_yesno() | |
responded_flag = 1 | |
if r_member.match(latest_message): | |
respond_to_member() | |
responded_flag = 1 | |
mo = r_get.match(latest_message) | |
if mo: | |
print("matched: get") | |
respond_to_get(mo.group(1)) | |
responded_flag = 1 | |
mo = None | |
mo = r_put.match(latest_message) | |
if mo: | |
print("matched: put, key=" + mo.group(1) + ", value=" + mo.group(2)) | |
respond_to_put(mo.group(1), mo.group(2)) | |
responded_flag = 1 | |
prev_message = latest_message |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment