/plugin_command_knowledge.py

https://github.com/DreigonDragon/magnet2 · Python · 177 lines · 129 code · 30 blank · 18 comment · 53 complexity · 8ad6ed934a3d5e46e619d6f51ac8dc6c MD5 · raw file

  1. #
  2. # This file is part of Magnet2.
  3. # Copyright (c) 2011 Grom PE
  4. #
  5. # Magnet2 is free software: you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation, either version 3 of the License, or
  8. # (at your option) any later version.
  9. #
  10. # Magnet2 is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with Magnet2. If not, see <http://www.gnu.org/licenses/>.
  17. #
  18. import time
  19. import xmpp
  20. from magnet_api import *
  21. from magnet_utils import *
  22. knowledge_db = {}
  23. def getterm(bot, room, term):
  24. prefix = bot.get_config(room, 'db_prefix')
  25. if not prefix in knowledge_db: return
  26. if not term in knowledge_db[prefix]: return
  27. return knowledge_db[prefix][term]
  28. def setterm(bot, room, term, termdic):
  29. prefix = bot.get_config(room, 'db_prefix')
  30. if not prefix in knowledge_db: knowledge_db[prefix] = {}
  31. if termdic:
  32. knowledge_db[prefix][term] = termdic
  33. elif term in knowledge_db[prefix]:
  34. del knowledge_db[prefix][term]
  35. def gettermtext(bot, room, nick, term, mode, access_level):
  36. if access_level < LEVEL_GUEST and mode != 'help':
  37. return (False, '')
  38. term_key = term.lower()
  39. existent_term = getterm(bot, room, term_key)
  40. if not existent_term:
  41. return (False, "I don't know %s."%(term))
  42. res = existent_term['def']
  43. if res[:3] == '[h]' and mode != 'help':
  44. return (False, "%s definition is only displayed with !help."%(term))
  45. if len(res) > 512 and mode == 'what':
  46. return (False, "%s definition is too long, use !help or !show."%(term))
  47. if mode == 'help' and access_level >= LEVEL_ADMIN:
  48. t = timeformat(time.time()-existent_term['time'])
  49. res = '%s\n(added by %s %s ago)'%(res, existent_term['jid'], t)
  50. if mode == 'show':
  51. res = '%s\n(Requested by %s)'%(res, nick)
  52. return (True, '%s: %s'%(term, res))
  53. def command_help(bot, room, nick, access_level, parameters, message):
  54. term = parameters or 'index'
  55. (success, result) = gettermtext(bot, room, nick, term, 'help', access_level)
  56. if not success and access_level >= LEVEL_GUEST: return result
  57. bot.send_room_message(room+'/'+nick, result)
  58. def command_what(bot, room, nick, access_level, parameters, message):
  59. if not parameters: return 'What term to look up?'
  60. term = parameters
  61. mode = 'what'
  62. if message.getType() == 'chat': mode = 'help'
  63. (success, result) = gettermtext(bot, room, nick, term, mode, access_level)
  64. if not success: return result
  65. return result
  66. def command_show(bot, room, nick, access_level, parameters, message):
  67. if not parameters: return 'Expected: <term> <target>'
  68. try: (term, target) = parameters.split(' ', 1)
  69. except: return "Show definition to whom?"
  70. if not target in bot.roster[room]:
  71. return "I don't see %s here."%(target)
  72. (success, result) = gettermtext(bot, room, nick, term, 'show', access_level)
  73. if not success: return result
  74. bot.send_room_message(room+'/'+target, result)
  75. def command_remember(bot, room, nick, access_level, parameters, message):
  76. try: (term, definition) = parameters.split(' ', 1)
  77. except: return "Expected: <term> <definition>"
  78. jid = bot.roster[room][nick][ROSTER_JID]
  79. if jid != None: jid = xmpp.JID(jid).getStripped().lower()
  80. for c in term:
  81. if ord(c) > 127 or ord(c)<32:
  82. return "Bad term, don't use unicode."
  83. if term == '' or term == ':':
  84. return "The term is empty."
  85. # remove : added by common mistake
  86. if term[-1] == ':': term = term[:-1]
  87. term_key = term.lower()
  88. existent_term = getterm(bot, room, term_key)
  89. if existent_term and access_level < LEVEL_ADMIN:
  90. if existent_term['jid'] != jid:
  91. return "You can't redefine %s."%(term)
  92. if access_level < LEVEL_ADMIN:
  93. definition +=' (added by '+nick+')'
  94. termdic = {
  95. 'def': definition,
  96. 'jid': jid,
  97. 'time': time.time(),
  98. }
  99. setterm(bot, room, term_key, termdic)
  100. return "I know %s!"%(term)
  101. def command_forget(bot, room, nick, access_level, parameters, message):
  102. if not parameters: return 'You forgot the term.'
  103. term = parameters
  104. jid = bot.roster[room][nick][ROSTER_JID]
  105. if jid != None: jid = xmpp.JID(jid).getStripped().lower()
  106. term_key = term.lower()
  107. existent_term = getterm(bot, room, term_key)
  108. if not existent_term:
  109. return "I don't know %s."%(term)
  110. if access_level < LEVEL_ADMIN:
  111. if not jid or existent_term['jid'] != jid or time.time() - existent_term['time'] > 3600:
  112. return "You can't delete %s."%(term)
  113. setterm(bot, room, term_key, None)
  114. return "Forgotten."
  115. def event_unhandled_command(bot, (room, nick, command, access_level, parameters, message)):
  116. if command:
  117. mode = ''
  118. if parameters:
  119. target = parameters
  120. if target in bot.roster[room]:
  121. target = room+'/'+target
  122. mode = 'show'
  123. else:
  124. if message.getType() == 'groupchat':
  125. target = room
  126. mode = 'what'
  127. else:
  128. target = room+'/'+nick
  129. mode = 'help'
  130. if mode:
  131. term = command
  132. (success, result) = gettermtext(bot, room, nick, term, mode, access_level)
  133. if success:
  134. bot.send_room_message(target, result)
  135. return 1 # prevent further processing
  136. def load(bot):
  137. global knowledge_db
  138. knowledge_db = bot.load_database('knowledge') or {}
  139. bot.add_command('help', command_help, LEVEL_IGNORED)
  140. bot.add_command('what', command_what, LEVEL_GUEST)
  141. bot.add_command('show', command_show, LEVEL_GUEST)
  142. bot.add_command('remember', command_remember, LEVEL_MEMBER)
  143. bot.add_command('forget', command_forget, LEVEL_MEMBER)
  144. def unload(bot):
  145. bot.save_database('knowledge', knowledge_db)
  146. def info(bot):
  147. return 'Knowledge plugin v1.0'