Advertisement
CVSoft

Stickybot IRC Framework Test Code

Jun 22nd, 2015
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.37 KB | None | 0 0
  1. import irc
  2. import time
  3. #debugging
  4. import sys
  5. import traceback
  6.  
  7. # using default IRC values because this is a pastebin, not my laptop
  8.  
  9. # --- start time functions --- #
  10. def startTmr():
  11.     return time.clock()
  12.  
  13. def checkTmr(t):
  14.     return time.clock()-t
  15.  
  16. def checkTmr_df(t):
  17.     """(fractional day)^-1"""
  18.     return 86400/checkTmr(t)
  19. # --- end time functions --- #
  20.  
  21. # --- start shitparse --- #
  22. def find_all(s, c):
  23.     """string, cmp"""
  24.     o = s.find(c, 0)
  25.     i = []
  26.     while o != -1:
  27.         i.append(o)
  28.         o = s.find(c, o+1)
  29.     return i
  30.  
  31. def clean_hostmask(s):
  32.     if s[0] == ':': s = s[1:]
  33.     if '!' not in s:
  34.         return s
  35.     #if s[0] != ':':
  36.     return s[:s.find('!')]
  37.     #return s[s.find(':'):s.find('!')]
  38.  
  39. def shitparse(s):
  40.     """IRC raw command, channel, source, text"""
  41.     # chan, cmd, src, text
  42.     try:
  43.         parse = False
  44.         p = map(lambda a:a+1, find_all(s, ' '))
  45.         if s[0] != ':':
  46.             # not a command starting the line
  47.             parse = True
  48.             cmd = s[:p[0]-1]
  49.             if cmd == "PING":
  50.                 chan = "SERVER"
  51.                 src = "SERVER"
  52.                 text = s[p[0]+1:]
  53.             else:
  54.                 chan = s[p[0]:p[1]-1]
  55.                 src = 'SERVER'
  56.                 text= s[s.find(':', p[1])+1:]
  57.         else:
  58.             cmd = s[p[0]:p[1]-1]
  59.             if cmd in ["JOIN", "PART"]:
  60.                 chan = s[p[1]+1:]
  61.                 src = 'CLIENT'
  62.                 text = "Joined or parted %s" % chan
  63.             elif cmd == "NICK":
  64.                 chan = clean_hostmask(s[:p[0]-1])
  65.                 src = "CLIENT"
  66.                 text = s[p[1]+1:]
  67.             else:
  68.                 chan = s[p[1]:p[2]-1]
  69.                 src = clean_hostmask(s[:p[0]-1])
  70.                 text = s[p[2]:]
  71.                 if text[0] == ':': text = text[1:]
  72.             parse = True
  73.         if not parse:
  74.             cmd, chan, src = ('',)*3
  75.             text = s
  76.         return [cmd, chan, src, text]
  77.     except:
  78.         e = sys.exc_info()
  79.         print "ERROR IN SHITPARSE:"
  80.         print "Line: $%s$" % s
  81.         for x in e[:-1]: print "    "+str(x)
  82.         print "TRACEBACK:"
  83.         traceback.print_tb(e[-1])
  84.         return ['ERROR']+['']*3
  85. # --- end shitparse --- #
  86. def run():
  87.     t = startTmr()
  88.     irc.start_thread()
  89.     l = ''
  90.     znc_skip = False
  91.     while True:
  92.         l = irc.get_rline()
  93.         time.sleep(0.001) # much calmer infinite loops
  94.         if len(l) == 0: continue
  95.         f = shitparse(l)
  96.         # znc shut-up code
  97. ##      if "buffextras" in f[2]: continue
  98.         if f[2] == "***" and f[3] == "Buffer Playback...": znc_skip = True
  99.         if f[2] == "***" and f[3] == "Playback Complete.": znc_skip = False
  100.         if znc_skip: continue
  101.         if f[0] in ["PRIVMSG", "MODE", "001", "376", "JOIN", "PART", "KICK", "NICK", "464"] and f[2] != "***":
  102.             print "%s: [%s] <%s> %s" % (f[1], f[0], f[2], f[3])
  103.         text = f[3]
  104.         if f[0] == "464": irc.send_queue.put("PASS imnot:anidiot")
  105.         if "say something" in text:
  106.             irc.send_queue.put("PRIVMSG %s :Hi %s" % (f[1], f[2]))
  107.         if "&killbot" == text:
  108.             if f[1][0] != "#": f[1] = "private message"
  109.             irc.send_queue.put("PRIVMSG %s :%s killed bot at %d from %s" % (irc.ch, f[2], int(time.time()), f[1]))
  110.             break
  111.     irc.kill_thread()
  112.  
  113. run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement