Merge branch 'develop' of github.com:ClouDev/CloudBot into develop
This commit is contained in:
commit
c5e05c0063
16
README.md
16
README.md
|
@ -98,26 +98,26 @@ The developers of CloudBot run two CloudBots on [Espernet](http://esper.net).
|
||||||
|
|
||||||
They can both be found in [#CloudBot](irc://irc.esper.net/cloudbot "Connect via IRC to #CloudBot on irc.esper.net).
|
They can both be found in [#CloudBot](irc://irc.esper.net/cloudbot "Connect via IRC to #CloudBot on irc.esper.net).
|
||||||
|
|
||||||
**mau5bot** is the stable bot, and runs on the latest release version of CloudBot. (mau5bot is running on **Ubuntu Server** *Oneric Ocelot/11.10* with **Python** *2.7.2*)
|
**mau5bot** is the semi-stable bot, and runs on the latest stable development version of CloudBot. (mau5bot is running on **Ubuntu Server** *Oneric Ocelot/11.10* with **Python** *2.7.2*)
|
||||||
|
|
||||||
**neerbot** is the unstable bot, and runs on the latest development² version of CloudBot. (neerbot is running on **Debian** *Wheezy/Testing* with **Python** *2.7.2*)
|
**neerbot** is the unstable bot, and runs on the latest(ish) development version of CloudBot. (neerbot is running on **Debian** *Wheezy/Testing* with **Python** *2.7.2*)
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
CloudBot runs on **Python** *2.7.x*. It is developed on **Debian** *Wheezy/Testing* and **Ubuntu** *11.10* with **Python** *2.7.2*.
|
CloudBot runs on **Python** *2.7.x*. It is developed on **Debian** *Wheezy/Testing* and **Ubuntu** *11.10* with **Python** *2.7.2*.
|
||||||
|
|
||||||
It **requires Python modules** `lXML`, `BeautifulSoup`, `Enchant`, `psutil`, and `HTTPlib2`.
|
It **requires Python modules** `lXML`, `BeautifulSoup` and `Enchant`, `psutil`, and `HTTPlib2`.
|
||||||
|
|
||||||
The programs `screen` or `daemon` are recomended for the wrapper to run optimaly.
|
The programs `daemon` or `screen` are recomended for the wrapper to run optimaly.
|
||||||
|
|
||||||
**Windows** users: Windows compatibility with the wrapper and some plugins is **broken** (such as the ping), but we do intend to add it.³
|
**Windows** users: Windows compatibility with the wrapper and some plugins is **broken** (such as ping), but we do intend to add it.³
|
||||||
|
|
||||||
## License
|
## License
|
||||||
CloudBot is **licensed** under the **GPL v3** license. The terms are as follows.
|
CloudBot is **licensed** under the **GPL v3** license. The terms are as follows.
|
||||||
|
|
||||||
CloudBot/DEV
|
CloudBot/DEV
|
||||||
|
|
||||||
Copyright © 2011 ClouDev - <[cloudev.github.com](http://cloudev.github.com)>
|
Copyright © 2011-2012 Luke Rogers / ClouDev - <[cloudev.github.com](http://cloudev.github.com)>
|
||||||
|
|
||||||
CloudBot is free software: you can redistribute it and/or modify
|
CloudBot is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -134,8 +134,4 @@ CloudBot is **licensed** under the **GPL v3** license. The terms are as follows.
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
¹ if you prefer to run the bot with a custom backend/run it manually, or are on **Windows**, run the bot with `./bot.py`
|
|
||||||
|
|
||||||
² or whatever version [neersighted](http://git.io/neersighted) is currently hacking on
|
|
||||||
|
|
||||||
³ eventually
|
³ eventually
|
||||||
|
|
|
@ -15,7 +15,7 @@ def suggest(inp, inp_unstripped=''):
|
||||||
num, inp = m.groups()
|
num, inp = m.groups()
|
||||||
num = int(num)
|
num = int(num)
|
||||||
if num > 10:
|
if num > 10:
|
||||||
return 'can only get first ten suggestions'
|
return 'I can only get the first ten suggestions.'
|
||||||
else:
|
else:
|
||||||
num = 0
|
num = 0
|
||||||
|
|
||||||
|
@ -23,10 +23,10 @@ def suggest(inp, inp_unstripped=''):
|
||||||
page_json = page.split('(', 1)[1][:-1]
|
page_json = page.split('(', 1)[1][:-1]
|
||||||
suggestions = json.loads(page_json)[1]
|
suggestions = json.loads(page_json)[1]
|
||||||
if not suggestions:
|
if not suggestions:
|
||||||
return 'no suggestions found'
|
return 'No suggestions found.'
|
||||||
if num:
|
if num:
|
||||||
if len(suggestions) + 1 <= num:
|
if len(suggestions) + 1 <= num:
|
||||||
return 'only got %d suggestions' % len(suggestions)
|
return 'I only got %d suggestions.' % len(suggestions)
|
||||||
out = suggestions[num - 1]
|
out = suggestions[num - 1]
|
||||||
else:
|
else:
|
||||||
out = random.choice(suggestions)
|
out = random.choice(suggestions)
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
# written by Scaevolus, modified by Lukeroge
|
# written by Scaevolus, modified by Lukeroge
|
||||||
|
|
||||||
|
from util import hook, http
|
||||||
|
|
||||||
import random
|
import random
|
||||||
import re
|
import re
|
||||||
from time import strftime
|
from time import strftime, strptime
|
||||||
from time import strptime
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from util import hook
|
|
||||||
from util import http
|
from util.timesince import timesince
|
||||||
from util import timesince
|
|
||||||
|
|
||||||
|
|
||||||
def unescape_xml(string):
|
def unescape_xml(string):
|
||||||
|
@ -47,8 +47,8 @@ def parseDateTime(s):
|
||||||
|
|
||||||
@hook.command
|
@hook.command
|
||||||
def twitter(inp):
|
def twitter(inp):
|
||||||
"twitter <user>/<user> <n>/<id>/#<hashtag>/@<user> -- Gets last/<n>th "\
|
"twitter <user>/<user> <n>/<id>/#<hashtag>/@<user> -- Gets last/<n>th " \
|
||||||
"tweet from <user>/gets tweet <id>/Gets random tweet with #<hashtag>/"\
|
"tweet from <user>/gets tweet <id>/Gets random tweet with #<hashtag>/" \
|
||||||
"gets replied tweet from @<user>."
|
"gets replied tweet from @<user>."
|
||||||
|
|
||||||
def add_reply(reply_name, reply_id):
|
def add_reply(reply_name, reply_id):
|
||||||
|
@ -105,25 +105,25 @@ def twitter(inp):
|
||||||
url = 'http://search.twitter.com/search.atom?q=%23' + inp[1:]
|
url = 'http://search.twitter.com/search.atom?q=%23' + inp[1:]
|
||||||
searching_hashtag = True
|
searching_hashtag = True
|
||||||
else:
|
else:
|
||||||
return 'error: invalid request'
|
return 'Error: Invalid request.'
|
||||||
|
|
||||||
try:
|
try:
|
||||||
tweet = http.get_xml(url)
|
tweet = http.get_xml(url)
|
||||||
except http.HTTPError, e:
|
except http.HTTPError as e:
|
||||||
errors = {400: 'bad request (ratelimited?)',
|
errors = {400: 'Bad request (ratelimited?)',
|
||||||
401: 'tweet is private',
|
401: 'Tweet is private',
|
||||||
403: 'tweet is private',
|
403: 'Tweet is private',
|
||||||
404: 'invalid user/id',
|
404: 'Invalid user/id',
|
||||||
500: 'twitter is broken',
|
500: 'Twitter is broken',
|
||||||
502: 'twitter is down ("getting upgraded")',
|
502: 'Twitter is down ("getting upgraded")',
|
||||||
503: 'twitter is overloaded (lol, RoR)'}
|
503: 'Twitter is overloaded'}
|
||||||
if e.code == 404:
|
if e.code == 404:
|
||||||
return 'error: invalid ' + ['username', 'tweet id'][getting_id]
|
return 'error: invalid ' + ['username', 'tweet id'][getting_id]
|
||||||
if e.code in errors:
|
if e.code in errors:
|
||||||
return 'error: ' + errors[e.code]
|
return 'Error: %s.' % errors[e.code]
|
||||||
return 'error: unknown %s' % e.code
|
return 'Unknown Error: %s' % e.code
|
||||||
except http.URLError, e:
|
except http.URLError as e:
|
||||||
return 'error: timeout'
|
return 'Error: Request timed out.'
|
||||||
|
|
||||||
if searching_hashtag:
|
if searching_hashtag:
|
||||||
ns = '{http://www.w3.org/2005/Atom}'
|
ns = '{http://www.w3.org/2005/Atom}'
|
||||||
|
@ -153,7 +153,7 @@ def twitter(inp):
|
||||||
strptime(time.text,
|
strptime(time.text,
|
||||||
'%a %b %d %H:%M:%S +0000 %Y'))
|
'%a %b %d %H:%M:%S +0000 %Y'))
|
||||||
|
|
||||||
time_nice = timesince.timesince(parseDateTime(time_raw), datetime.utcnow())
|
time_nice = timesince(parseDateTime(time_raw), datetime.utcnow())
|
||||||
|
|
||||||
if tweet.find(retweeted_text) is not None:
|
if tweet.find(retweeted_text) is not None:
|
||||||
text = 'RT @%s:' % tweet.find(retweeted_screen_name).text
|
text = 'RT @%s:' % tweet.find(retweeted_screen_name).text
|
||||||
|
|
Reference in a new issue