/plugins/rank.py

https://gitlab.com/Lett1/SlackDuckBot · Python · 73 lines · 42 code · 21 blank · 10 comment · 5 complexity · 38bd891171dcacf2f1e9059c3cccb789 MD5 · raw file

  1. import db
  2. import logging
  3. import math
  4. from plugin import Plugin
  5. from trigger_handler import TriggerHandler
  6. from sqlalchemy import Table, Column, Integer, String, MetaData, Text
  7. class Rank(Plugin):
  8. """Ranks users by their message count."""
  9. def __init__(self):
  10. super(self.__class__, self).__init__()
  11. metadata = MetaData()
  12. self.scores_table = Table('scores', metadata,
  13. Column('username', String(100)),
  14. Column('score', Integer, default=0),
  15. Column('rank', Integer),
  16. Column('id', String(20), primary_key=True),
  17. Column('avatar', Text, nullable=True),
  18. )
  19. metadata.create_all(db.get_engine())
  20. self.trigger_handler = TriggerHandler("rank")
  21. def on_trigger(self, channel, user, message, trigger, s):
  22. s.send_msg("Ranks can be viewed at slackrank.lett.at/" + s.slack.server.domain, channel)
  23. def on_message(self, channel, user, message, s):
  24. username = user["user"]["name"]
  25. slackid = user["user"]["id"]
  26. avatar = user["user"]["profile"]["image_72"]
  27. with db.get_engine().begin() as conn:
  28. result = conn.execute(self.scores_table.select().where(self.scores_table.c.id == slackid))
  29. old_entry = result.fetchone()
  30. # Check if the user actually exists in the table
  31. if old_entry:
  32. old_rank = 0
  33. if old_entry is not None:
  34. old_rank = old_entry[2]
  35. #rank = floor(0.25 * sqrt(scores.score)),
  36. new_score = old_entry[1] + 1
  37. new_rank = math.floor(0.25 * math.sqrt(new_score))
  38. new_score = conn.execute(self.scores_table.update(self.scores_table.c.id == slackid).
  39. values(score=new_score, rank=new_rank, username=username, avatar=avatar)).last_updated_params()
  40. logging.debug("new score is %s", new_score)
  41. if new_rank > old_rank:
  42. s.send_msg("Rank Up! %s has reached Rank %d" % (username, new_rank), channel)
  43. # curs.execute("""INSERT INTO scores VALUES (%(username)s, 0, 0, %(id)s, %(avatar)s) ON CONFLICT (id) DO UPDATE
  44. # SET score = scores.score + 1,
  45. # rank = floor(0.25 * sqrt(scores.score)),
  46. # avatar = %(avatar)s
  47. # WHERE scores.id = %(id)s;""", {"username": username, "id": slackid, "avatar": avatar})
  48. # curs.execute("SELECT * FROM scores WHERE id = (%s);", (slackid,))
  49. # new_rank = curs.fetchone()[2]
  50. else:
  51. logging.debug("Inserting new user %s into table", username)
  52. conn.execute(self.scores_table.insert(), username=username, score=0, rank=0, id=slackid, avatar=avatar)