user_handlers.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. from flask import current_app
  2. from sqlite3 import Error
  3. from re import sub
  4. import random
  5. def get_users_points(db, user_id): # Look up one user's points by user id
  6. try:
  7. cursor = db.execute(
  8. "SELECT points FROM points WHERE id = ?",
  9. (user_id,)
  10. )
  11. return cursor.fetchone()[0]
  12. except Error as guperror:
  13. current_app.logger.error(f'Couldn\'t look up points for {user_id}: {guperror.args[0]}')
  14. def get_email_code(db, user_id): # Get user's verification code
  15. try:
  16. cursor = db.execute(
  17. "SELECT code FROM points WHERE id = ?",
  18. (user_id,)
  19. )
  20. return cursor.fetchone()[0]
  21. except Error as gecerror:
  22. current_app.logger.error(f'Couldn\'t look up points for {user_id}: {gecerror.args[0]}')
  23. def get_id_by_email(db, email): # Look up all users' points by username
  24. try:
  25. cursor = db.execute(
  26. "SELECT id, points FROM points WHERE email = ?",
  27. (email,)
  28. )
  29. users = cursor.fetchall()
  30. return users
  31. except Error as gaubeerror:
  32. current_app.logger.error(f'Couldn\'t look up user id for {email} by email: {gaubeerror.args[0]}')
  33. def get_all_users_by_name(db, username): # Look up all users' points by username
  34. try:
  35. cursor = db.execute(
  36. "SELECT * FROM points WHERE name = ?",
  37. (username,)
  38. )
  39. users = cursor.fetchall()
  40. return users
  41. except Error as gaubnerror:
  42. current_app.logger.error(f'Couldn\'t look up points for {username} by username: {gaubnerror.args[0]}')
  43. def get_all_users_with_user_id(db, user_id): # Look up all users' points by user id
  44. try:
  45. cursor = db.execute(
  46. "SELECT * FROM points WHERE id = ?",
  47. (user_id,)
  48. )
  49. users = cursor.fetchall()
  50. return users
  51. except Error as gauwuierror:
  52. current_app.logger.error(f'Couldn\'t look up points for {user_id} by user_id: {gauwuierror.args[0]}')
  53. def get_all_users(db): # Get all users' details from points database
  54. try:
  55. cursor = db.execute(
  56. "SELECT * FROM points"
  57. )
  58. users = cursor.fetchall()
  59. return users
  60. except Error as gauerror:
  61. current_app.logger.error(f'Couldn\'t get all users\' points: {gauerror.args[0]}')
  62. def award_chat_points(db, user_id, points): # Award points to user by user id
  63. try:
  64. db.execute(
  65. "UPDATE points SET points = points + ? WHERE id = ?",
  66. (points, user_id,)
  67. )
  68. db.commit()
  69. return True
  70. except Error as acperror:
  71. current_app.logger.error(f'Couldn\'t give {points} points to {user_id}: {acperror.args[0]}')
  72. return False
  73. def set_email_code(db, user_id, reg_code): # Set verification code
  74. try:
  75. db.execute(
  76. "UPDATE points SET code = ? WHERE id = ?",
  77. (reg_code, user_id,)
  78. )
  79. db.commit()
  80. return True
  81. except Error as secerror:
  82. current_app.logger.error(f'Couldn\'t set reg code \"{reg_code}\" for {user_id}: {secerror.args[0]}')
  83. return False
  84. def del_email_code(db, user_id): # Delete verification code
  85. try:
  86. db.execute(
  87. "UPDATE points SET code = NULL WHERE id = ?",
  88. (user_id,)
  89. )
  90. db.commit()
  91. return True
  92. except Error as decerror:
  93. current_app.logger.error(f'Couldn\'t remove reg code for {user_id}: {decerror.args[0]}')
  94. return False
  95. def adjust_points(db, user_id, points): # For streamer to manually adjust a user's points
  96. try:
  97. db.execute(
  98. "UPDATE points SET points = ? WHERE id = ?",
  99. (points, user_id,)
  100. )
  101. db.commit()
  102. return True
  103. except Error as aperror:
  104. current_app.logger.error(f'Couldn\'t adjust points for {user_id}: {aperror.args[0]}')
  105. return False
  106. def delete_user(db, user_id):
  107. try:
  108. db.execute(
  109. "DELETE FROM points WHERE id = ?",
  110. (user_id,)
  111. )
  112. db.commit()
  113. return True
  114. except Error as du_error:
  115. current_app.logger.error(f'Couldn\'t change delete {user_id} from the database: {du_error.args[0]}')
  116. return False
  117. def change_email(db, user_id, new_email): # For streamer to manually adjust a user's points
  118. try:
  119. ids = get_id_by_email(db, new_email)
  120. for user in ids:
  121. if user[0] != user_id: # If the found email belongs to a different user
  122. if 'temp' in user[0]: # If the email address belongs to a temp user
  123. existing_points = get_users_points(db, user_id)
  124. new_points = existing_points + user[1]
  125. if adjust_points(db, user_id, new_points): # Add points to correct user
  126. current_app.logger.info(f'Email was already in the database as a {user[0]}. Added points to {user_id}')
  127. if delete_user(db, user[0]): # Delete temp user
  128. current_app.logger.info(f'Removed temp user {user_id} from the database.')
  129. elif new_email is not None:
  130. current_app.logger.error(f'Couldn\'t change email address for {user_id}. {new_email} already belongs to {user[0]}')
  131. db.execute(
  132. "UPDATE points SET email = ? WHERE id = ?",
  133. (new_email, user_id,)
  134. )
  135. db.commit()
  136. return True
  137. except Error as ce_error:
  138. current_app.logger.error(f'Couldn\'t change email address for {user_id}: {ce_error.args[0]}')
  139. return False
  140. def spend_points(db, user_id, points): # A user spends points on a redeem
  141. try:
  142. db.execute(
  143. "UPDATE points SET points = points - ? WHERE id = ?",
  144. (points, user_id,)
  145. )
  146. db.commit()
  147. return True
  148. except Error as sperror:
  149. current_app.logger.error(f'Couldn\'t spend {user_id}\'s {points} points: {sperror.args[0]}')
  150. return False
  151. def refund_points(db, user_id, points): # Streamer refunds points for a redeem
  152. try:
  153. db.execute(
  154. "UPDATE points SET points = points + ? WHERE id = ?",
  155. (points, user_id,)
  156. )
  157. db.commit()
  158. return True
  159. except Error as rerror:
  160. current_app.logger.error(f'Couldn\'t refund {points} points for {user_id}: {rerror.args[0]}')
  161. return False
  162. def user_in_points(db, user_id): # Check if a user is in the points database
  163. try:
  164. cursor = db.execute(
  165. "SELECT points FROM points WHERE id = ?",
  166. (user_id,)
  167. )
  168. if cursor.fetchone() is None:
  169. return False
  170. return True
  171. except Error as uiperror:
  172. current_app.logger.error(f'Couldn\'t for {user_id} in points database: {uiperror.args[0]}')
  173. def add_email_to_points(db, email, points): # Add an anonymous user and points to the database
  174. try:
  175. id = f'temp{random.randint(10000, 99999)}' # Create random id with "temp" prepended
  176. db.execute(
  177. "INSERT INTO points(id, points, user_authed, email) VALUES(?, ?, 0, ?)",
  178. (id, points, email)
  179. )
  180. db.commit()
  181. return True
  182. except Error as aetperror:
  183. current_app.logger.error(f'Couldn\'t add {email} to points database: {aetperror.args[0]}')
  184. return False
  185. def add_user_to_points(db, user_id, display_name, authed): # Add a user to the points database
  186. try:
  187. cursor = db.execute(
  188. "SELECT points, name, user_authed FROM points WHERE id = ?",
  189. (user_id,)
  190. )
  191. user = cursor.fetchone()
  192. if user is None: # Add the user if they're not in the database
  193. cursor.execute(
  194. "INSERT INTO points(id, name, points, user_authed) VALUES(?, ?, 10, ?)",
  195. (user_id, display_name, authed)
  196. )
  197. if user is not None and user[1] is None: # If their name has changed, change name in the database
  198. cursor.execute(
  199. "UPDATE points SET name = ?, user_authed = ? WHERE id = ?",
  200. (display_name, authed, user_id)
  201. )
  202. if user is not None and user[2] != authed: # If they've authenticated, update the database
  203. cursor.execute(
  204. "UPDATE points SET user_authed = ? WHERE id = ?",
  205. (authed, user_id)
  206. )
  207. db.commit()
  208. return True
  209. except Error as autperror:
  210. current_app.logger.error(f'Couldn\'t add {user_id}/{display_name}/{authed} to database: {autperror.args[0]}')
  211. return False
  212. def change_name(db, user_id, new_name): # Change a user name in the points database
  213. try:
  214. db.execute(
  215. "UPDATE points SET name = ? WHERE id = ?",
  216. (new_name, user_id)
  217. )
  218. db.commit()
  219. except Error as cnerror:
  220. current_app.logger.error(f'Couldn\'t change name to {new_name} for {user_id}: {cnerror.args[0]}')
  221. def remove_duplicates(db, user_id, username): # Remove duplicate usernames
  222. try:
  223. db.execute(
  224. "UPDATE points SET name = NULL WHERE name = ? AND NOT id = ?",
  225. (username, user_id)
  226. )
  227. db.commit()
  228. except Error as rderror:
  229. current_app.logger.error(f'Couldn\'t remove duplicate username {username} for {user_id}: {rderror.args[0]}')