http://canonical.org/~kragen/blosxom.cgi is (the current and probably
quite ephemeral URL of) a blog I feed from an IRC channel; here's the
IRC bot that feeds the blog from the IRC channel. Trivial bit of
code, really (though it could do with some tweaking), but I expect
that the convenience of blogging stuff through GAIM will have a major
effect on what I blog.
#!/usr/bin/python
# blogbot: simple blogging IRC bot. Produces blog posts via blosxom
# whenever someone utters a URL on a channel where blogbot is
# listening. Written using Twisted Python, which really rocks.
# This turns GAIM, irssi, Jabber, and suchlike into instant blogging
# and blog-reading tools.
# TODO:
# - some level of authentication
# - better titles when none are suggested by the user --- e.g. page title
# - support for blosxom categorization
# - all-lowercase filenames
# - provide a link to the IRC channel so people can watch the IRC version
# of the blog in real time.
# config parameters:
# blogbotchannel, near the top
# "localhost", 6667, near the bottom: the IRC server to talk to
# '/home/kragen/hackblogdata', in the middle: the Blosxom data dir
import sys
sys.path.insert(0, '/home/kragen/lib/python')
from twisted.protocols import irc
from twisted.internet import reactor, protocol
import time, re, cgi, os
blogbotchannel = '#blogbot'
class blogbot(irc.IRCClient):
def __init__(self, **args):
self.last_timestamp = time.time()
self.nickname = 'blogbot'
self.realname = 'kragen+blogbot'
self.versionName = 'blogbot'
self.versionNum = '0'
def signedOn(self):
self.join(blogbotchannel)
def noticed(self, user, channel, message): pass
def privmsg(self, user, channel, message):
# user looks like [EMAIL PROTECTED]
user = user[:user.index('!')]
message = cgi.escape(message)
htmlre = 'http://[^<>() ]*[^<>() ,.:;]'
if not re.search(htmlre, message): return
title = cgi.escape('from %s' % user, quote=1)
titlemo = re.match('^(.*): ', message)
if titlemo:
title = titlemo.group(1)
message = message[titlemo.end(0):] + ' -%s' % user
msghtml = re.sub(htmlre,
r'<a href="\g<0>">\g<0></a>',
message)
self.say(blogbotchannel,
"I'll blog title=%s, msghtml=%s" % (title, msghtml))
blog(title, msghtml)
def entryfilename(basefilename, serial):
dirname = '/home/kragen/hackblogdata'
return os.path.join(dirname, basefilename + serial + '.txt')
def blog(title, msghtml):
basefilename = re.sub('[^a-zA-Z0-9]', '', title)
serial = ''
while os.path.exists(entryfilename(basefilename, serial)):
if serial == '': serial = '0'
serial = str(int(serial) + 1)
wr = open(entryfilename(basefilename, serial), 'w')
wr.write("%s\n%s\n" % (title, msghtml))
wr.close()
class blogbotfactory(protocol.ClientFactory):
protocol = blogbot
def clientConnectionLost(self, connector, reason): connector.connect()
def clientConnectionFailed(self, connector, reason): reactor.stop()
def main():
irccf = blogbotfactory()
reactor.connectTCP("localhost", 6667, irccf)
reactor.run()
if __name__ == "__main__": main()
--
<[EMAIL PROTECTED]> Kragen Sitaker <http://www.pobox.com/~kragen/>
Edsger Wybe Dijkstra died in August of 2002. The world has lost a great
man. See http://advogato.org/person/raph/diary.html?start=252 and
http://www.kode-fu.com/geek/2002_08_04_archive.shtml for details.