curse.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from rollbot import as_command, initialize_data, RollbotFailure, Message, Context
  2. from rollbot.injection import Data, Args, Lazy, Injector
  3. @initialize_data
  4. class CurseScore:
  5. score: int = 0
  6. zero_passes: int = 0
  7. def touch(self):
  8. if self.score == 0:
  9. self.zero_passes += 1
  10. def __str__(self):
  11. return f"{self.score}{'!' * self.zero_passes}"
  12. class Target(Injector[str]):
  13. async def inject(self, message: Message, context: Context) -> str:
  14. args = await Args.inject(message, context)
  15. key = args.rsplit("for", maxsplit=1)[0].strip().replace(" ", "_").lower()
  16. if key == "":
  17. RollbotFailure.INVALID_ARGUMENTS.raise_exc(
  18. detail="I need to know who or what you're trying to curse!"
  19. )
  20. return key
  21. @as_command
  22. def karma(target: Target(), score: Data(CurseScore).For(Target())):
  23. return f"{target.capitalize()} = {score}"
  24. @as_command
  25. async def curse(target: Target(), store: Data(CurseScore)):
  26. score = await store.load_or(target)
  27. score.score -= 1
  28. score.touch()
  29. await store.save(target, score)
  30. return f"{target.capitalize()} = {score}"
  31. @as_command
  32. async def bless(target: Target(), store: Data(CurseScore)):
  33. score = await store.load_or(target)
  34. score.score += 1
  35. score.touch()
  36. await store.save(target, score)
  37. return f"{target.capitalize()} = {score}"
  38. @as_command
  39. async def blurse(target: Target(), store: Data(CurseScore)):
  40. score = await store.load_or(target)
  41. score.touch()
  42. await store.save(target, score)
  43. return f"{target.capitalize()} = {score}"