A Python robot that edits Wikipedia and interacts with people over IRC https://en.wikipedia.org/wiki/User:EarwigBot
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

162 lines
4.2 KiB

  1. # -*- coding: utf-8 -*-
  2. from wiki.tools.constants import *
  3. from wiki.tools.exceptions import UserNotFoundError
  4. from wiki.tools.page import Page
  5. class User(object):
  6. """
  7. EarwigBot's Wiki Toolset: User Class
  8. """
  9. def __init__(self, site, name):
  10. """
  11. Docstring needed
  12. """
  13. # Site instance, for doing API queries, etc
  14. self.site = site
  15. # Username
  16. self._name = name
  17. # Attributes filled in by an API query
  18. self._exists = None
  19. self._userid = None
  20. self._blockinfo = None
  21. self._groups = None
  22. self._rights = None
  23. self._editcount = None
  24. self._registration = None
  25. self._emailable = None
  26. self._gender = None
  27. def _get_attribute(self, attr, force):
  28. """
  29. Docstring needed
  30. """
  31. if self._exists is None or force:
  32. self._load_attributes()
  33. if self._exists is False:
  34. e = "User '{0}' does not exist.".format(self._name)
  35. raise UserNotFoundError(e)
  36. return getattr(self, attr)
  37. def _load_attributes(self):
  38. """
  39. Docstring needed
  40. """
  41. params = {"action": "query", "list": "users", "ususers": self._name,
  42. "usprop": "blockinfo|groups|rights|editcount|registration|emailable|gender"}
  43. result = self.site.api_query(params)
  44. # normalize our username in case it was entered oddly
  45. self._name = result["query"]["users"][0]["name"]
  46. try:
  47. self._userid = result["query"]["users"][0]["userid"]
  48. except KeyError: # userid is missing, so user does not exist
  49. self._exists = False
  50. return
  51. self._exists = True
  52. res = result['query']['users'][0]
  53. self._groups = res["groups"]
  54. self._rights = res["rights"]
  55. self._editcount = res["editcount"]
  56. self._registration = res["registration"]
  57. self._gender = res["gender"]
  58. try:
  59. res["emailable"]
  60. except KeyError:
  61. self._emailable = False
  62. else:
  63. self._emailable = True
  64. try:
  65. self._blockinfo = {"by": res["blockedby"],
  66. "reason": res["blockreason"], "expiry": res["blockexpiry"]}
  67. except KeyError:
  68. self._blockinfo = False
  69. def name(self, force=False):
  70. """
  71. Docstring needed
  72. """
  73. if force:
  74. self._load_attributes()
  75. return self._name
  76. def exists(self, force=False):
  77. """
  78. Docstring needed
  79. """
  80. if self._exists is None or force:
  81. self._load_attributes()
  82. return self._exists
  83. def userid(self, force=False):
  84. """
  85. Docstring needed
  86. """
  87. return self._get_attribute("_userid", force)
  88. def blockinfo(self, force=False):
  89. """
  90. Docstring needed
  91. """
  92. return self._get_attribute("_blockinfo", force)
  93. def groups(self, force=False):
  94. """
  95. Docstring needed
  96. """
  97. return self._get_attribute("_groups", force)
  98. def rights(self, force=False):
  99. """
  100. Docstring needed
  101. """
  102. return self._get_attribute("_rights", force)
  103. def editcount(self, force=False):
  104. """
  105. Docstring needed
  106. """
  107. return self._get_attribute("_editcount", force)
  108. def registration(self, force=False):
  109. """
  110. Docstring needed
  111. """
  112. return self._get_attribute("_registration", force)
  113. def is_emailable(self, force=False):
  114. """
  115. Docstring needed
  116. """
  117. return self._get_attribute("_emailable", force)
  118. def gender(self, force=False):
  119. """
  120. Docstring needed
  121. """
  122. return self._get_attribute("_gender", force)
  123. def userpage(self):
  124. """
  125. Docstring needed
  126. """
  127. prefix = self.site.namespace_id_to_name(NS_USER)
  128. pagename = ''.join((prefix, ":", self._name))
  129. return Page(self.site, pagename)
  130. def talkpage(self):
  131. """
  132. Docstring needed
  133. """
  134. prefix = self.site.namespace_id_to_name(NS_USER_TALK)
  135. pagename = ''.join((prefix, ":", self._name))
  136. return Page(self.site, pagename)