Skip to content

Commit

Permalink
Library inside, minor improvements, release
Browse files Browse the repository at this point in the history
  • Loading branch information
idooo committed Apr 9, 2014
1 parent 7106904 commit 1687a99
Show file tree
Hide file tree
Showing 7 changed files with 152 additions and 33 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Pancake Bot (HipChat version)
Pancake chat bot (HipChat edition)
============

Features:
Expand Down
5 changes: 3 additions & 2 deletions conf/example.conf
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
[credentials]
api = example_api_key
[general]
api_token = example_api_key
bot_name = Pancake
rooms = ExampleRoom,SecondRoom

[aws]
Expand Down
10 changes: 8 additions & 2 deletions pancake.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
#!/usr/bin/env python

__project_name__ = 'Pancake chat bot (HipChat edition)'
__version__ = '1.0'

import argparse
import src as library

if __name__ == "__main__":

print(__project_name__ + ', version ' + __version__)

parser = argparse.ArgumentParser()
parser.add_argument('-c', '--config', help='config file to be used')

Expand All @@ -15,9 +20,10 @@
conf = library.config.Settings(conf_name)

bot = library.Bot(
conf.credentials['api'],
conf.general['api_token'],
name=conf.general['bot_name'],
aws=conf.aws
)
bot.joinRooms(conf.credentials['rooms'])

bot.joinRooms(conf.general['rooms'])
bot.start()
1 change: 0 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
boto
requests
python-simple-hipchat
70 changes: 44 additions & 26 deletions src/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
import re
import random
import inspect
import hipchat
from time import time
from ec2_helper import EC2Helper
from simple_hipchat import HipChat
from time import sleep
from urllib2 import HTTPError

# For Arnold
from _arnold_phrases import ARNOLD_PHRASES
Expand All @@ -24,14 +25,20 @@ class Bot():
hipster = None
name = 'Pancake'

refresh_time = 6 # seconds

rooms_users = {}
get_users_timeout = 5 * 60 * 1000 # 5 min
get_users_timeout = 5 * 60 # 5 min

def __init__(self, api_token, name=None, aws=False):

self.hipster = hipchat.HipChat(token=api_token)
self.hipster = HipChat(token=api_token)

self.available_rooms = dict(map(lambda x:[x['name'],x['room_id']], self.hipster.list_rooms()['rooms']))
try:
self.available_rooms = dict(map(lambda x:[x['name'],x['room_id']], self.hipster.list_rooms()['rooms']))
except HTTPError:
print('Error! API token not specified or invalid')
exit()

if aws:
self.__awsInit(aws)
Expand Down Expand Up @@ -91,6 +98,10 @@ def __setActions(self):
'action': self.__cmdRoll,
'help': 'Roll a random number 0 - 100'
},
'/limit': {
'action': self.__cmdGetLimit,
'help': 'Get current HipChat API limit status'
},
'/?': {
'action': self.__cmdAsk,
'help': 'Ask me a question'
Expand Down Expand Up @@ -140,7 +151,6 @@ def __getLatestDates(self):

def __getUsers(self, room_name):
if not room_name in self.rooms_users or self.rooms_users[room_name]['time'] + self.get_users_timeout < time():
print('recalculate')
users = self.hipster.method(
'rooms/show',
method='GET',
Expand Down Expand Up @@ -319,6 +329,14 @@ def __cmdRoll(self, room_name, username):
response = '{0} rolled {1}'.format(self.__mentionUser(username), random.randint(0, 100))
self.postMessage(room_name, response)

def __cmdGetLimit(self, room_name):
message = '{0}/{1} calls remaining, update in {2} seconds'.format(
self.hipster.limits['remaining'],
self.hipster.limits['limit'],
self.hipster.limits['reset'] - time()
)
self.postMessage(room_name, message)

# Public
# ==================================================================

Expand All @@ -340,38 +358,38 @@ def start(self):

while True:

print '.'
print('.')

for room_name in self.joined_rooms:

#try:
messages = self.__getMessages(room_name, last_dates[room_name])
try:
messages = self.__getMessages(room_name, last_dates[room_name])

if messages:
last_dates[room_name] = self.__getLatestDate(messages)
if messages:
last_dates[room_name] = self.__getLatestDate(messages)

for message in messages:
for message in messages:

if message['from']['name'] != self.name:
if message['from']['name'] != self.name:

for action_name in self.actions:
for action_name in self.actions:

fields = set(inspect.getargspec(self.actions[action_name]['action'])[0])
args = {'room_name': room_name}
fields = set(inspect.getargspec(self.actions[action_name]['action'])[0])
args = {'room_name': room_name}

if 'user_id' in fields:
args.update({'user_id': message['from']['user_id']})
if 'user_id' in fields:
args.update({'user_id': message['from']['user_id']})

if 'username' in fields:
args.update({'username': message['from']['name']})
if 'username' in fields:
args.update({'username': message['from']['name']})

if 'message' in fields:
args.update({'message': message['message']})
if 'message' in fields:
args.update({'message': message['message']})

if action_name in message['message']:
self.actions[action_name]['action'](**args)
if action_name in message['message']:
self.actions[action_name]['action'](**args)

#except Exception, e:
# print str(e)
except Exception, e:
print(str(e))

sleep(6)
sleep(self.refresh_time)
2 changes: 1 addition & 1 deletion src/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
class Settings():

rules = {
'credentials': ['api', 'rooms'],
'general': ['api_token', 'rooms', 'bot_name'],
'aws': ['access_key', 'secret_key']
}

Expand Down
95 changes: 95 additions & 0 deletions src/simple_hipchat.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# https://github.com/kurttheviking/python-simple-hipchat
# https://github.com/idooo/python-simple-hipchat

try:
from urllib.parse import urljoin
from urllib.parse import urlencode
import urllib.request as urlrequest
except ImportError:
from urlparse import urljoin
from urllib import urlencode
import urllib2 as urlrequest
import json


API_URL_DEFAULT = 'https://api.hipchat.com/v1/'
FORMAT_DEFAULT = 'json'


class HipChat(object):

limits = {}

def __init__(self, token=None, url=API_URL_DEFAULT, format=FORMAT_DEFAULT):
self.url = url
self.token = token
self.format = format
self.opener = urlrequest.build_opener(urlrequest.HTTPSHandler())

class RequestWithMethod(urlrequest.Request):
def __init__(self, url, data=None, headers={}, origin_req_host=None, unverifiable=False, http_method=None):
urlrequest.Request.__init__(self, url, data, headers, origin_req_host, unverifiable)
if http_method:
self.method = http_method

def get_method(self):
if self.method:
return self.method
return urlrequest.Request.get_method(self)

def method(self, url, method="GET", parameters=None, timeout=None):
method_url = urljoin(self.url, url)

if method == "GET":
if not parameters:
parameters = dict()

parameters['format'] = self.format
parameters['auth_token'] = self.token

query_string = urlencode(parameters)
request_data = None
else:
query_parameters = dict()
query_parameters['auth_token'] = self.token

query_string = urlencode(query_parameters)

if parameters:
request_data = urlencode(parameters).encode('utf-8')
else:
request_data = None

method_url = method_url + '?' + query_string

req = self.RequestWithMethod(method_url, http_method=method, data=request_data)
response = self.opener.open(req, None, timeout)

info = response.info()
self.limits = {
'limit': int(info.getheaders('X-RateLimit-Limit')[0]),
'remaining': int(info.getheaders('X-RateLimit-Remaining')[0]),
'reset': int(info.getheaders('X-RateLimit-Reset')[0])
}

response_data = response.read()

return json.loads(response_data.decode('utf-8'))

def list_rooms(self):
return self.method('rooms/list')

def message_room(self, room_id='', message_from='', message='', message_format='text', color='', notify=False):
parameters = dict()
parameters['room_id'] = room_id
parameters['from'] = message_from[:15]
parameters['message'] = message
parameters['message_format'] = message_format
parameters['color'] = color

if notify:
parameters['notify'] = 1
else:
parameters['notify'] = 0

return self.method('rooms/message', 'POST', parameters)

0 comments on commit 1687a99

Please sign in to comment.