Advertisement
banjax

Untitled

Jun 11th, 2014
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.48 KB | None | 0 0
  1. import random
  2. import re
  3. import time
  4.  
  5. from util import hook
  6.  
  7.  
  8. def format_sprite(q, num, n_sprites):
  9. """Returns a formatted string of a quote"""
  10. ctime, name, msg = q
  11. return "[{}/{}] <{}> {}".format(num, n_sprites,
  12. name, msg)
  13.  
  14.  
  15. def create_table_if_not_exists(db):
  16. """Creates an empty sprite table if one does not already exist"""
  17. db.execute("create table if not exists sprite"
  18. "(chan, name, add_name, msg, time real, deleted default 0, "
  19. "primary key (chan, name, msg))")
  20. db.commit()
  21.  
  22.  
  23. def add_sprite(db, chan, name, add_name, msg):
  24. """Adds a sprite to a sprite name, returns message string"""
  25. try:
  26. db.execute('''INSERT OR FAIL INTO sprite
  27. (chan, name, add_name, msg, time)
  28. VALUES(?,?,?,?,?)''',
  29. (chan, name, add_name, msg, time.time()))
  30. db.commit()
  31. except db.IntegrityError:
  32. return "Message already stored, doing nothing."
  33. return "Sprite added."
  34.  
  35.  
  36. def del_sprite(db, chan, name, add_name, msg):
  37. """Deletes a sprite from a sprite name"""
  38. db.execute('''UPDATE sprite SET deleted = 1 WHERE
  39. chan=? AND lower(name)=lower(?) AND msg=msg''')
  40. db.commit()
  41.  
  42.  
  43. def get_sprite_num(num, count, name):
  44. """Returns the sprite number to fetch from the DB"""
  45. if num: # Make sure num is a number if it isn't false
  46. num = int(num)
  47. if count == 0: # Error on no sprites
  48. raise Exception("No sprites found for {}.".format(name))
  49. if num and num < 0: # Count back if possible
  50. num = count + num + 1 if num + count > -1 else count + 1
  51. if num and num > count: # If there are not enough sprites, raise an error
  52. raise Exception("I only have {} sprite{} for {}.".format(count, ('s', '')[count == 1], name))
  53. if num and num == 0: # If the number is zero, set it to one
  54. num = 1
  55. if not num: # If a number is not given, select a random one
  56. num = random.randint(1, count)
  57. return num
  58.  
  59.  
  60. def get_sprite_by_name(db, name, num=False):
  61. """Returns a sprite from a name, random or selected by number"""
  62. count = db.execute('''SELECT COUNT(*) FROM sprite WHERE deleted != 1
  63. AND lower(name) = lower(?)''', [name]).fetchall()[0][0]
  64.  
  65. try:
  66. num = get_sprite_num(num, count, name)
  67. except Exception as error_message:
  68. return error_message
  69.  
  70. sprite = db.execute('''SELECT time, name, msg
  71. FROM sprite
  72. WHERE deleted != 1
  73. AND lower(name) = lower(?)
  74. ORDER BY time
  75. LIMIT ?, 1''', (name, (num - 1))).fetchall()[0]
  76. return format_sprite(sprite, num, count)
  77.  
  78.  
  79. def get_sprite_by_name_chan(db, chan, name, num=False):
  80. """Returns a sprite from a name in a channel, random or selected by number"""
  81. count = db.execute('''SELECT COUNT(*)
  82. FROM sprite
  83. WHERE deleted != 1
  84. AND chan = ?
  85. AND lower(name) = lower(?)''', (chan, name)).fetchall()[0][0]
  86.  
  87. try:
  88. num = get_sprite_num(num, count, name)
  89. except Exception as error_message:
  90. return error_message
  91.  
  92. sprite = db.execute('''SELECT time, name, msg
  93. FROM sprite
  94. WHERE deleted != 1
  95. AND chan = ?
  96. AND lower(name) = lower(?)
  97. ORDER BY time
  98. LIMIT ?, 1''', (chan, name, (num - 1))).fetchall()[0]
  99. return format_sprite(sprite, num, count)
  100.  
  101.  
  102. def get_sprite_by_chan(db, chan, num=False):
  103. """Returns a sprite from a channel, random or selected by number"""
  104. count = db.execute('''SELECT COUNT(*)
  105. FROM sprite
  106. WHERE deleted != 1
  107. AND chan = ?''', (chan,)).fetchall()[0][0]
  108.  
  109. try:
  110. num = get_sprite_num(num, count, chan)
  111. except Exception as error_message:
  112. return error_message
  113.  
  114. sprite = db.execute('''SELECT time, name, msg
  115. FROM sprite
  116. WHERE deleted != 1
  117. AND chan = ?
  118. ORDER BY time
  119. LIMIT ?, 1''', (chan, (num - 1))).fetchall()[0]
  120. return format_quote(quote, num, count)
  121.  
  122.  
  123. @hook.command('s')
  124. @hook.command
  125. def sprite(inp, name='', chan='', db=None, notice=None):
  126. """sprite [#chan] [name] [#n]/.sprite add <name> <msg>
  127. Gets random or [#n]th sprite by <name> or from <#chan>/adds sprite."""
  128. create_table_if_not_exists(db)
  129.  
  130. add = re.match(r"add[^\w@]+(\S+?)>?\s+(.*)", inp, re.I)
  131. retrieve = re.match(r"(\S+)(?:\s+#?(-?\d+))?$", inp)
  132. retrieve_chan = re.match(r"(#\S+)\s+(\S+)(?:\s+#?(-?\d+))?$", inp)
  133.  
  134. if add:
  135. quoted_name, msg = add.groups()
  136. notice(add_sprite(db, chan, quoted_name, name, msg))
  137. return
  138. elif retrieve:
  139. select, num = retrieve.groups()
  140. by_chan = True if select.startswith('#') else False
  141. if by_chan:
  142. return get_sprite_by_chan(db, select, num)
  143. else:
  144. return get_sprite_by_name(db, select, num)
  145. elif retrieve_chan:
  146. chan, name, num = retrieve_chan.groups()
  147. return get_quote_by_name_chan(db, chan, name, num)
  148.  
  149. notice(sprite.__doc__)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement