Skip to content

Instantly share code, notes, and snippets.

@shiumachi
Created November 28, 2018 06:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shiumachi/f1f526a38538ff9ccc66e9cb400bf3c3 to your computer and use it in GitHub Desktop.
Save shiumachi/f1f526a38538ff9ccc66e9cb400bf3c3 to your computer and use it in GitHub Desktop.
# -*- 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