Skip to content

Commit dac6498

Browse files
committed
Merge pull request #30 from wardellchandler/image_system
Image system
2 parents 877ed49 + dec4474 commit dac6498

File tree

4 files changed

+116
-35
lines changed

4 files changed

+116
-35
lines changed

Core/Bot.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22
# coding=utf-8
33
from datetime import date, datetime
44
import os
5+
import random
56
import sys
67
import asyncio
8+
import tempfile
79
import time
810
import signal
911
import traceback
12+
from urllib import request
13+
from urllib.request import FancyURLopener
1014

1115
import hangups
1216
from hangups.ui.utils import get_conv_name
@@ -16,6 +20,12 @@
1620
from Core import Handlers
1721

1822

23+
class HangoutsBotOpener(FancyURLopener):
24+
version = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36'
25+
26+
27+
request.urlretrieve = HangoutsBotOpener().retrieve
28+
1929
__version__ = '1.1'
2030
LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
2131

@@ -217,17 +227,32 @@ def send_message(self, conversation, text):
217227
""""Send simple chat message"""
218228
self.send_message_segments(conversation, [hangups.ChatMessageSegment(text)])
219229

220-
def send_message_segments(self, conversation, segments):
230+
231+
def send_message_segments(self, conversation, segments, image_id=None):
221232
"""Send chat message segments"""
222233
# Ignore if the user hasn't typed a message.
223234
if len(segments) == 0:
224235
return
225236
# XXX: Exception handling here is still a bit broken. Uncaught
226237
# exceptions in _on_message_sent will only be logged.
227238
asyncio.async(
228-
conversation.send_message(segments)
239+
conversation.send_message(segments, image_id=image_id)
229240
).add_done_callback(self._on_message_sent)
230241

242+
243+
@asyncio.coroutine
244+
def upload_image(self, url, filename=None, delete=False):
245+
if not filename:
246+
tempdir = tempfile.gettempdir()
247+
filename = tempdir + os.sep + '{}.png'.format(random.randint(0, 9999999999))
248+
request.urlretrieve(url, filename)
249+
file = open(filename, "rb")
250+
image_id = yield from self._client.upload_image(file)
251+
if delete:
252+
file.close()
253+
os.remove(filename)
254+
return image_id
255+
231256
def list_conversations(self):
232257
"""List all active conversations"""
233258
convs = sorted(self._conv_list.get_all(),

Core/Commands/DefaultCommands.py

Lines changed: 45 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,48 @@ 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"])
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+
@DispatcherSingleton.register
751+
def gif(bot, event, *args):
752+
query = ' '.join(args)
753+
url = 'http://ajax.googleapis.com/ajax/services/search/images?v=1.0&rsz=8&safe=active&imgtype=animated&' \
754+
+ parse.urlencode({'q': query})
755+
resp = request.urlopen(url)
756+
image_json = json.loads(resp.read().decode())
757+
url = image_json['responseData']['results'][0]['unescapedUrl']
758+
759+
@asyncio.coroutine
760+
def send_image(bot, event, url):
761+
image_id = yield from bot.upload_image(url)
762+
bot.send_message_segments(event.conv, [
763+
hangups.ChatMessageSegment("Picture Message", segment_type=hangups.SegmentType.LINE_BREAK)],
764+
image_id=image_id)
765+
766+
yield from send_image(bot, event, url)
767+

Core/Commands/Dispatcher.py

Lines changed: 34 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,12 +71,45 @@ def run(self, bot, event, bot_command_char, *args, **kwds):
7071
log.close()
7172
print(traceback.format_exc())
7273

74+
def register_aliases(self, aliases=None):
75+
"""Registers a command under the function name & any names specified in aliases.
76+
"""
77+
78+
def func_wrapper(func):
79+
self.commands[func.__name__] = func
80+
for alias in aliases:
81+
self.commands[alias] = func
82+
return func
83+
84+
return func_wrapper
85+
86+
def register_extras(self, is_hidden=False, aliases=None):
87+
"""Registers a function as hidden with aliases, or any combination of that."""
88+
89+
def func_wrapper(func):
90+
if is_hidden and aliases:
91+
self.hidden_commands[func.__name__] = func
92+
for alias in aliases:
93+
self.hidden_commands[alias] = func
94+
elif aliases:
95+
self.commands[func.__name__] = func
96+
for alias in aliases:
97+
self.commands[alias] = func
98+
elif is_hidden:
99+
self.hidden_commands[func.__name__] = func
100+
else:
101+
self.commands[func.__name__] = func
102+
return func
103+
104+
return func_wrapper
105+
73106
def register(self, func):
74107
"""Decorator for registering command"""
75108
self.commands[func.__name__] = func
76109
return func
77110

78111
def register_hidden(self, func):
112+
"""Registers a command as hidden (This makes it only runnable by the Bot and it won't appear in the help menu)"""
79113
self.hidden_commands[func.__name__] = func
80114
return func
81115

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)