From 249d7c583d04cf58e47bf020371adec99b478506 Mon Sep 17 00:00:00 2001 From: Jeremiah Malina Date: Sun, 17 Mar 2013 23:30:20 -0400 Subject: [PATCH] Commit all the things --- README.md | 17 ++++++++++++++++ TODO.txt | 4 ++++ gudguy/__init__.py | 11 ++++++++++ gudguy/__init__.pyc | Bin 0 -> 393 bytes gudguy/config.py | 11 ++++++++++ gudguy/config.pyc | Bin 0 -> 632 bytes gudguy/giphy.py | 48 ++++++++++++++++++++++++++++++++++++++++++++ gudguy/giphy.pyc | Bin 0 -> 1867 bytes gudguy/sc.py | 16 +++++++++++++++ gudguy/sc.pyc | Bin 0 -> 723 bytes gudguy/utils.py | 12 +++++++++++ gudguy/utils.pyc | Bin 0 -> 460 bytes gudguy/youtube.py | 24 ++++++++++++++++++++++ gudguy/youtube.pyc | Bin 0 -> 1026 bytes requirements.txt | 7 +++++++ run.py | 5 +++++ run.pyc | Bin 0 -> 206 bytes 17 files changed, 155 insertions(+) create mode 100644 README.md create mode 100644 TODO.txt create mode 100644 gudguy/__init__.py create mode 100644 gudguy/__init__.pyc create mode 100644 gudguy/config.py create mode 100644 gudguy/config.pyc create mode 100644 gudguy/giphy.py create mode 100644 gudguy/giphy.pyc create mode 100644 gudguy/sc.py create mode 100644 gudguy/sc.pyc create mode 100644 gudguy/utils.py create mode 100644 gudguy/utils.pyc create mode 100644 gudguy/youtube.py create mode 100644 gudguy/youtube.pyc create mode 100644 requirements.txt create mode 100644 run.py create mode 100644 run.pyc diff --git a/README.md b/README.md new file mode 100644 index 0000000..4ac5fa2 --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +# GudGuy + +My IRC bot built with [irctk](https://github.com/maxcountryman/irctk) that sits in #tech@nyu on irc.freenode.net and searches the internets for the gud stuff. +Currently searches [Giphy](http://giphy.com), [SoundCloud](http://soundcloud.com), and [YouTube](http://youtube.com). + +* How to add a bot command: + + from gudguy import bot + + @bot.command('mc') # shortcut + @bot.command + def my_command(context): + command = context.args # the command that was issued + return 'Hi.' + +* Then in `gudguy/__init__.py` make sure the module your command was defined in is imported. +* All command must be prefixed with `'.'`. diff --git a/TODO.txt b/TODO.txt new file mode 100644 index 0000000..cefb1bb --- /dev/null +++ b/TODO.txt @@ -0,0 +1,4 @@ +Stuff to implement +------------------ +/r/gifs search +gifbin search diff --git a/gudguy/__init__.py b/gudguy/__init__.py new file mode 100644 index 0000000..09f86b1 --- /dev/null +++ b/gudguy/__init__.py @@ -0,0 +1,11 @@ +from irctk import Bot + +from gudguy.config import Config + +# initialize the bot +bot = Bot() +bot.config.from_object(Config) + +# load the plugins +from gudguy import giphy, sc, youtube + diff --git a/gudguy/__init__.pyc b/gudguy/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2bee591ea7fe44a81937d374300c19caa3051d4d GIT binary patch literal 393 zcmYjLO;5ux41H<3ucAr)89lXs03ietMOhDtprHKh literal 0 HcmV?d00001 diff --git a/gudguy/config.py b/gudguy/config.py new file mode 100644 index 0000000..670bf2e --- /dev/null +++ b/gudguy/config.py @@ -0,0 +1,11 @@ + +class Config(object): + SERVER = 'irc.freenode.net' + PORT = 6667 + SSL = False + TIMEOUT = 300 + NICK = 'GudGuy' + REALNAME = 'The gud guy.' + CHANNELS = ['#tech@nyu'] + ADMINS = [] + SOUNDCLOUD_CLIENT_ID = '643405e1e13dd4cde125f3379ef36486' diff --git a/gudguy/config.pyc b/gudguy/config.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ec2b50aacf096e18f433ce0fa2744efa14fcaac GIT binary patch literal 632 zcmb7BO;5r=5FJ1eP!nT3c_Q)Bg8{LKniyj(RU1puwixZD!R{1mpcr<0;H(G#uYbVV z_48_*c{^`9^JZpSdS9#Gy`A60@b#4FJSF2>1PlNHk^-;-yaK!c+=oPp;A=8ZR0zyj zmZamK`T~W{$hbj3#WJ6;C?&!Y;1YyosSs9xl^|ROMv*G8GK?vq24hOD1FJx|0-moe zOR05&bRIX8Ibt?r*vwF*D>PubL+#WQ7dgAg7krg6gGX$Pb4Ipk@)`xU1;&r3*&-JW zV%?73+1jWap;R$1*3Vs_Z@84b3n#Z4)ccQve6Zinn^MG*x literal 0 HcmV?d00001 diff --git a/gudguy/giphy.py b/gudguy/giphy.py new file mode 100644 index 0000000..e733b44 --- /dev/null +++ b/gudguy/giphy.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- + +""" +Consume the Giphy API -- http://giphy.com/ +i.e. 'http://giphy.com/api/gifs?tag=cat' +""" +import random +import requests +import urllib + +from gudguy import bot +from gudguy.utils import timestamp_utcnow + +GIPHY_API = 'http://giphy.com/api' + + +def search_api_url(**kwargs): + endpoint = '/gifs?%s' % (urllib.urlencode(kwargs)) + return GIPHY_API + endpoint + + +def search_api_request(query): + res = requests.get(search_api_url(tag=query)) + return res.json() if res.status_code == 200 else None + + +def search_gifs(query): + content = search_api_request(query) + return content['data'] if content is not None else None + + +def get_gif(gifs, random_gif=False): + if random_gif: + return random.choice(gifs) + return gifs[0] + + +@bot.command('g') +@bot.command +def giphy(context): + query = context.args + opts = {'random_gif': 'random ' in query} + query = query.replace('random ', '') if opts['random_gif'] else query + query = query.replace(' ', '-') + gifs = search_gifs(query) + if not gifs: + return 'Welp.' + return get_gif(gifs, **opts)['thumbnail_url'] diff --git a/gudguy/giphy.pyc b/gudguy/giphy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96f102527659c15fc4dd8230fda0c7f6928507d9 GIT binary patch literal 1867 zcmbtU+l~`Q5Url^W$pFChDBVImk~;`BSmYA2cjr~BnSzDB3WcC6vZ#2*_p;3@7yxo zqh$p=!E62?AC&*$1K?D(H>)VTptarQs=n4ab-Mlcdt>$L@oy<@KR*6{Ml*lIWJF6? zMVUv1q9q*Xd$jb-T_&yaqD*LqTlj3x41rff%? zUD6ZEM)VGc?2+!%<_cwFdaKU;U7m&zzvWd~%jYoTM|EYoQU`XegC}{jJ_{Z` zdm0=a1#4@YA7--^_f6BfoQ?CTo(6~i>ra{-vtF2=Y_fWgCiZZgf52xRD(r8WljGXD zV4r*PQX89;P2AbEs!z>zbbe}6q1D46Z}BUd`4R@?SfY)h*MjNB8^j*HR&;X_^5nVM zfprOeZ9-ma2QXb*6#20oIagO{ooR`lJbm`dA2C47a+!N_nzSopc_UqAO`TUZgim73 zxA11qjc(0sQzk`TC9_3twVAEDY}K9p`zORTXZ8x_8=bW2ItEoS68VCAdN8C8RLV4Q z=G^fJ&D?`=7=a9U87V1L4_E}qt3=8*nT{Kh6^|$M;Jg$Y z7&nK9L@O_CB;w(fbz@D$s=Wl~oSi(d-@q{}Q}Rc66Yi*MY69+iDwHRa6NuxiPUASb z4nN{&EMjemFx?Ch8;o`+GeA literal 0 HcmV?d00001 diff --git a/gudguy/sc.py b/gudguy/sc.py new file mode 100644 index 0000000..5138cb0 --- /dev/null +++ b/gudguy/sc.py @@ -0,0 +1,16 @@ +from gudguy import bot + +import soundcloud + +client = soundcloud.Client(client_id=bot.config['SOUNDCLOUD_CLIENT_ID']) + + +@bot.command('sc') +@bot.command +def soundcloud_track(context): + query = context.args + tracks = client.get('/tracks', q=query) + if not tracks: + return 'Welp.' + track = tracks[0] + return "%s %s" % (track.obj['title'], track.obj['permalink_url']) diff --git a/gudguy/sc.pyc b/gudguy/sc.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7bebc00ad3d2fd6387f8b54119bc8e52fa923a9 GIT binary patch literal 723 zcmb7BO>5&Y5FN>hvkfWRL${DyF9n~PKd>wdNehAE(zv1Ei*YU0*p=4EY<3n&Mm1~7dC5f5GLgBrq{_~1VL0uHIiBbJDQ5y=<-s0D%;dIXORhIm9IGli}( zDHNVk6y2`F#r)=Wy-4Oa%d7A{SuRl0hRrg*%Z_=>c_}2=0h9oH0Z7gyS3nteoL%gR zNU#C>j)<}AJykJ;o#)E&VR~RAm_A83i-IpC8Cv!`!#2&HEy)7B*dgJAHk-?W2)OXV zo?lqx4J^=TJSMi$ZIzm$eong91Z)%;(l)o~6X}a}50GngbMsjC2RUih)Tm$4slIf& z-MU)`CoUD63g{#_pyJ5s+UnNMN|!mEMFna*%R7~K+mFd+mzyn~&|%wjwaQG>sl>^0 z!FECb-jVnwd@&GX;hw>z?qycIk7I(*>u!7QKCdsWsh^5`#d_G6QdMcKR$pnsdHsa{ YbIpq1t44K3|KQKCyl^5Xa_UXQJ9oF1GXMYp literal 0 HcmV?d00001 diff --git a/gudguy/utils.py b/gudguy/utils.py new file mode 100644 index 0000000..927de47 --- /dev/null +++ b/gudguy/utils.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- + +""" +Some utility functions +""" +import time +import datetime + + +def timestamp_utcnow(): + now = datetime.datetime.now() + return time.mktime(now.timetuple()) diff --git a/gudguy/utils.pyc b/gudguy/utils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..635d3ddb0992cd11c319ff457a79d687415757cf GIT binary patch literal 460 zcmb7A!Ait15S=vZs%1rw9v4pq!Tx}VAb4D`WiP#i(!?dTX^WX41wE~wM34yNBpmhc%1^w`b>>m?zBJL&9(?c$dorwws%Ve~75U0%7-n{y}b#-U^Ixj66 zpKpTRgz0ebH2!9s@M5p%v38>h*pPKfInVYW&PDtWcuav(dT5j?c+i4x3x52ccVz#5 V0MCBw1|2$c$9kT}or{H7$X^;CVrKvV literal 0 HcmV?d00001 diff --git a/gudguy/youtube.py b/gudguy/youtube.py new file mode 100644 index 0000000..4984e6b --- /dev/null +++ b/gudguy/youtube.py @@ -0,0 +1,24 @@ +import requests + +from gudguy import bot + +base_url = 'http://gdata.youtube.com/feeds/api/' +search_api_url = base_url + 'videos?v=2&alt=jsonc&max-results=1' +video_url = "http://youtube.com/watch?v={0}" + + +@bot.command('yt') +@bot.command +def youtube_search(context): + res = requests.get(search_api_url, params={'q': context.args}) + if not res.status_code == 200: + return 'Error making request' + + data = res.json() + if 'error' in data: + return 'Error performing search.' + if data['data']['totalItems'] == 0: + return 'No results.' + + video = data['data']['items'][0] + return "%s %s" % (video['title'], video_url.format(video['id'])) \ No newline at end of file diff --git a/gudguy/youtube.pyc b/gudguy/youtube.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75222fc36183bf36ab78333fdc93a51d7b0b4263 GIT binary patch literal 1026 zcmbVK&2G~`5T3OYr%lrzq4JXpRG?P5G%h`GKopP=NL(V32qEPXZM~b+sU4>~i3O0ao1SWzTb*tClD~QQ&zb5s1tu?Nl{^qCCQmm3R zJuL{I@b`>p`aF(DMw4#OijvAx+fIr+9$ITK*3&e`$DDVW8e8D2%ah{+ozck{i%D{j z>#IX&vCIfhp5nt*xql0N)|8y_#V<#53OHp(iJ++PiTJ$XgWp*Yz*qsNFy>UjHJdzb z0MBlenzOB7%wvae9snK-4LxyH;RayNm#T0bzMSN;v} zZ_c?z1Fl(aLX#pG*SxU>P3CVHz`b5;o3V8`1TfW3=SYJ7BK^q{cUio3u5f#~K2Im3 zJ!daUi$qlpSP9^RzbRAehK0)|4Xt*`S(}6eVV>%&P(eC-Pd3MtEx-*Hoq|hxg4@1k zDq)oB`?$A{-bX2A)>E4rziX0(FOi_%_Q(=#Nlo8(z*`-ZF7xfR8zD(6WEdq5lEPRY zkQLK92mI=NzK|dzXle;^s1n7+b literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..bc067b2 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +IrcTK==0.2.7 +fudge==1.0.3 +pyflakes==0.6.1 +requests==1.1.0 +simplejson==3.1.0 +soundcloud==0.3.6 +wsgiref==0.1.2 diff --git a/run.py b/run.py new file mode 100644 index 0000000..8090800 --- /dev/null +++ b/run.py @@ -0,0 +1,5 @@ +from gudguy import bot + + +if __name__ == '__main__': + bot.run() diff --git a/run.pyc b/run.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a4e498473be420567ea730eca13fdbb4adaaa71 GIT binary patch literal 206 zcmYLCK?=e!5S&d!L==2RJm?EVJb4t|vhr{6FbZbAb%!i_*yzz94Ax-~4}A@K&tvr6KsChVxcT#9%LlHuNlFk{x* z6}8v;ltp36rz)B%4j0}qN_^q0*4fuZuhQoaee&>m`x>%*=UNjRyH8PlN?yqY{Qzh1 BB+UQ- literal 0 HcmV?d00001