Skip to content

Commit 054c6e1

Browse files
committed
Can now send images and gifs.
Added in a named alias system.
1 parent af3bf6a commit 054c6e1

File tree

4 files changed

+96
-35
lines changed

4 files changed

+96
-35
lines changed

Core/Bot.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,26 @@
22
# coding=utf-8
33
from datetime import date, datetime
44
import os
5+
import random
56
import sys
67
import asyncio
78
import time
89
import signal
910
import traceback
11+
from urllib import request
12+
from urllib.request import FancyURLopener
1013

1114
import hangups
1215
from hangups.ui.utils import get_conv_name
16+
import io
1317
from Core.Commands.Dispatcher import DispatcherSingleton
1418

1519
from Core.Util import ConfigDict, UtilDB
1620
from Core import Handlers
1721

22+
class HangoutsBotOpener(FancyURLopener):
23+
version = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36'
24+
request.urlretrieve = HangoutsBotOpener().retrieve
1825

1926
__version__ = '1.1'
2027
LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
@@ -217,17 +224,29 @@ def send_message(self, conversation, text):
217224
""""Send simple chat message"""
218225
self.send_message_segments(conversation, [hangups.ChatMessageSegment(text)])
219226

220-
def send_message_segments(self, conversation, segments):
227+
228+
def send_message_segments(self, conversation, segments, image_id=None):
221229
"""Send chat message segments"""
222230
# Ignore if the user hasn't typed a message.
223231
if len(segments) == 0:
224232
return
225233
# XXX: Exception handling here is still a bit broken. Uncaught
226234
# exceptions in _on_message_sent will only be logged.
227235
asyncio.async(
228-
conversation.send_message(segments)
236+
conversation.send_message(segments, image_id=image_id)
229237
).add_done_callback(self._on_message_sent)
230238

239+
240+
@asyncio.coroutine
241+
def upload_image(self, url):
242+
filename = '{}.png'.format(random.randint(0, 9999999999))
243+
request.urlretrieve(url, filename)
244+
file = open(filename, "rb")
245+
image_id = yield from self._client.upload_image(file)
246+
file.close()
247+
os.remove(filename)
248+
return image_id
249+
231250
def list_conversations(self):
232251
"""List all active conversations"""
233252
convs = sorted(self._conv_list.get_all(),

Core/Commands/DefaultCommands.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1+
import asyncio
2+
import html
13
import json
4+
import os
5+
import random
6+
import threading
27
from urllib import parse
38
from urllib import request
49
import re
@@ -715,9 +720,49 @@ def karma(bot, event, name=None, *args):
715720
segments.append(hangups.ChatMessageSegment("{}: {}".format(karma_list[i][0], karma_list[i][1])))
716721
segments.append(hangups.ChatMessageSegment("\n", segment_type=hangups.SegmentType.LINE_BREAK))
717722

718-
719723
segments.append(hangups.ChatMessageSegment("\n", segment_type=hangups.SegmentType.LINE_BREAK))
720724
segments.append(hangups.ChatMessageSegment("Average Karma:", is_italic=True))
721725
segments.append(hangups.ChatMessageSegment("\n", segment_type=hangups.SegmentType.LINE_BREAK))
722726
segments.append(hangups.ChatMessageSegment('{}'.format((sum([i[1] for i in karma_list]) / len(karma_list)))))
723727
bot.send_message_segments(event.conv, segments)
728+
729+
730+
@DispatcherSingleton.register_aliases(["img", "image"])
731+
def image(bot, event, *args):
732+
query = ' '.join(args)
733+
url = 'http://ajax.googleapis.com/ajax/services/search/images?v=1.0&rsz=8&safe=active&' \
734+
+ parse.urlencode({'q': query})
735+
736+
resp = request.urlopen(url)
737+
image_json = json.loads(resp.read().decode())
738+
url = image_json['responseData']['results'][0]['unescapedUrl']
739+
740+
@asyncio.coroutine
741+
def send_image(bot, event, url):
742+
image_id = yield from bot.upload_image(url)
743+
bot.send_message_segments(event.conv, [
744+
hangups.ChatMessageSegment("Picture Message", segment_type=hangups.SegmentType.LINE_BREAK)],
745+
image_id=image_id)
746+
747+
yield from send_image(bot, event, url)
748+
749+
750+
# TODO ASYNC ASAP
751+
@DispatcherSingleton.register
752+
def gif(bot, event, *args):
753+
query = ' '.join(args)
754+
url = 'http://ajax.googleapis.com/ajax/services/search/images?v=1.0&rsz=8&safe=active&imgtype=animated&' \
755+
+ parse.urlencode({'q': query})
756+
resp = request.urlopen(url)
757+
image_json = json.loads(resp.read().decode())
758+
url = image_json['responseData']['results'][0]['unescapedUrl']
759+
760+
@asyncio.coroutine
761+
def send_image(bot, event, url):
762+
image_id = yield from bot.upload_image(url)
763+
bot.send_message_segments(event.conv, [
764+
hangups.ChatMessageSegment("Picture Message", segment_type=hangups.SegmentType.LINE_BREAK)],
765+
image_id=image_id)
766+
767+
yield from send_image(bot, event, url)
768+

Core/Commands/Dispatcher.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import asyncio
22
from datetime import datetime
3+
from functools import wraps
34
from Core.Util import UtilBot
45
import traceback
56

@@ -70,6 +71,24 @@ def run(self, bot, event, bot_command_char, *args, **kwds):
7071
log.close()
7172
print(traceback.format_exc())
7273

74+
# def register(self, func, aliases=None):
75+
# """Decorator for registering command"""
76+
# if aliases is None or len(aliases) == 0:
77+
# self.commands[func.__name__] = func
78+
# else:
79+
# for alias in aliases:
80+
# self.commands[alias] = func
81+
# return func
82+
83+
84+
def register_aliases(self, aliases=None):
85+
def func_wrapper(func):
86+
for alias in aliases:
87+
self.commands[alias] = func
88+
return func
89+
return func_wrapper
90+
91+
7392
def register(self, func):
7493
"""Decorator for registering command"""
7594
self.commands[func.__name__] = func

Core/Commands/ExtraCommands.py

Lines changed: 10 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import hangups
1313
import re
1414
import requests
15+
import parsedatetime
1516
from Core.Commands.Dispatcher import DispatcherSingleton
1617
from Core.Util import UtilBot
1718
from Libraries import Genius
@@ -140,43 +141,20 @@ def send_reminder(bot, conv, reminder_time, reminder_text, loop):
140141

141142
# Set a new reminder
142143
args = list(args)
143-
date = str(datetime.now().today().date())
144-
time = str((datetime.now() + timedelta(hours=1)).time())
145-
set_date = False
146-
set_time = False
147-
index = 0
148-
while index < len(args):
149-
item = args[index]
150-
if item[0].isnumeric():
151-
if '/' in item or '-' in item:
152-
date = item
153-
args.remove(date)
154-
set_date = True
155-
index -= 1
156-
else:
157-
time = item
158-
args.remove(time)
159-
set_time = True
160-
index -= 1
161-
if set_date and set_time:
162-
break
163-
index += 1
164-
165-
reminder_time = date + ' ' + time
166-
if len(args) > 0:
167-
reminder_text = ' '.join(args)
168-
else:
144+
reminder_text = ' '.join(args)
145+
result = parsedatetime.nlp(reminder_text)
146+
reminder_time = result[0][0]
147+
reminder_text.replace(result[0][-1], '')
148+
if reminder_text.strip() == '':
169149
bot.send_message(event.conv, 'No reminder text set.')
170150
return
151+
171152
current_time = datetime.now()
172-
try:
173-
reminder_time = parser.parse(reminder_time)
174-
except (ValueError, TypeError):
175-
bot.send_message(event.conv, "Couldn't parse " + reminder_time + " as a valid date.")
176-
return
177153
if reminder_time < current_time:
178-
reminder_time = current_time + timedelta(hours=1)
154+
bot.send_message("Invalid Date: {}".format(reminder_time.strftime('%B %d, %Y %I:%M%p')))
155+
179156
reminder_interval = (reminder_time - current_time).seconds
157+
180158
reminder_timer = threading.Timer(reminder_interval, send_reminder,
181159
[bot, event.conv, reminder_interval, reminder_text, asyncio.get_event_loop()])
182160
reminders.append((reminder_timer, reminder_text, current_time))

0 commit comments

Comments
 (0)