Skip to content

Instantly share code, notes, and snippets.

@Chocimier
Last active May 17, 2017 21:18
Show Gist options
  • Save Chocimier/0245e4118763007f5b4a5b59f5e6beca to your computer and use it in GitHub Desktop.
Save Chocimier/0245e4118763007f5b4a5b59f5e6beca to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
import re
import irc.bot
import lxml
from bs4 import BeautifulSoup
from six.moves import urllib
class TestBot(irc.bot.SingleServerIRCBot):
def __init__(self, channels, nickname, server, port=6667):
super(TestBot, self).__init__([(server, port)], nickname, nickname)
self.channels_list = channels
self.issue_regexp = re.compile('#(?P<number>\\d+)')
def on_nicknameinuse(self, connection, event):
connection.nick(event.arguments[0] + '_')
def on_welcome(self, connection, event):
for channel in self.channels_list:
connection.join(channel)
def on_privmsg(self, connection, event):
self.do_command(event, event.source.nick)
def on_pubmsg(self, connection, event):
self.do_command(event, event.target)
def do_command(self, event, target):
matches = self.issue_regexp.finditer(event.arguments[0])
for match in matches:
number = match.group(1)
request = urllib.request.Request('https://github.com/OtterBrowser/otter-browser/issues/' + number)
try:
html = urllib.request.urlopen(request).read().decode('utf-8')
except urllib.error.HTTPError:
return
soup = BeautifulSoup(html, 'lxml')
title = soup.select('.js-issue-title')[0].text.strip()
author = soup.select('.gh-header-meta .author')[0].text.strip()
closed = soup.select('.gh-header-meta .State--red')
merged = soup.select('.gh-header-meta .State--purple')
pr = soup.select('.gh-header-meta .octicon-git-pull-request')
tags = ['']
if len(pr) > 0:
tags.append('[PR]')
elif len(merged) > 0:
tags.append('[merged]')
elif len(closed) > 0:
tags.append('[closed]')
message = '#{}{}: {} by {}'.format(number, ' '.join(tags), title, author)
self.connection.privmsg(target, re.sub('\\s+', ' ', message, flags=re.I))
def main():
import sys
if len(sys.argv) != 4:
print('Usage: testbot <server[:port]> <,-separated channels list> <nickname>')
sys.exit(1)
if ':' in sys.argv[1]:
server, port = sys.argv[1].split(':', 1)
else:
server = sys.argv[1]
port = 6667
try:
port = int(port)
except ValueError:
print('Error: Erroneous port "{}".'.format(port))
sys.exit(1)
channels = sys.argv[2].split(',')
nickname = sys.argv[3]
bot = TestBot(channels, nickname, server, port)
bot.start()
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment