summaryrefslogtreecommitdiffstats
path: root/modules/oblique.py
blob: 55a27fc80bf1b85025ff437c43bc5c9bd8c183aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/env python
"""
oblique.py - Web Services Interface
Copyright 2008, Sean B. Palmer, inamidst.com
Licensed under the Eiffel Forum License 2.

http://inamidst.com/phenny/
"""

import urllib
import web

def mappings(uri): 
   result = {}
   bytes = web.get(uri)
   for line in bytes.splitlines(): 
      if not line.startswith('<li>'): continue
      line = line.strip()
      if not line.endswith('</li>'): continue

      command, template = line[4:-5].split(' ', 1)
      if not template.startswith('http://'): continue
      result[command] = template
   return result

def o(phenny, input): 
   """Call a webservice."""
   text = input.group(2)

   if (not o.services) or (text == 'refresh'): 
      if hasattr(phenny.config, 'services'): 
         services = phenny.config.services
      else: services = 'http://swhack.jottit.com/services'

      o.services = mappings(services)
      if text == 'refresh': 
         return phenny.reply('Okay, found %s services.' % len(o.services))

   if ' ' in text: 
      command, args = text.split(' ', 1)
   else: command, args = text, ''
   command = command.lower()
   args = urllib.quote(args)

   if o.services.has_key(command): 
      template = o.services[command]
      template = template.replace('${args}', args)
      template = template.replace('${nick}', input.nick)
      uri = template.replace('${sender}', input.sender)

      bytes = web.get(uri)
      lines = bytes.splitlines()
      if lines: 
         phenny.say(lines[0])
      else: phenny.reply('Sorry, the service is broken.')
   else: phenny.reply('Sorry, no such service. See %s' % services)
o.commands = ['o']
o.example = '.o servicename arg1 arg2 arg3'
o.services = {}

if __name__ == '__main__': 
   print __doc__.strip()