patched issue where you could earn infinite exp if you send messages in bot dms, other changes are commentated

#23
Files changed (1) hide show
  1. app.py +33 -19
app.py CHANGED
@@ -3,6 +3,7 @@ import re
3
  import csv
4
  import json
5
  import time
 
6
  import random
7
  import asyncio
8
  import discord
@@ -44,6 +45,8 @@ GRADIO_APP_URL = "https://huggingface.co/spaces/discord-community/LevelBot"
44
  # Dictionary to store user IDs and their corresponding unique strings
45
  user_tokens = {}
46
 
 
 
47
 
48
  """"""
49
  XP_PER_MESSAGE = 10 # 100k messages = 1M exp = lvl 100
@@ -244,12 +247,13 @@ scheduler.start()
244
  #asyncio.get_event_loop().run_forever()
245
 
246
 
247
- def calculate_level(xp):
248
- return int(xp ** (1.0 / 3.0))
249
 
250
 
251
- def calculate_xp(level):
252
- return (int(level ** 3))
 
253
 
254
 
255
  async def add_exp(member_id):
@@ -336,6 +340,8 @@ async def add_exp(member_id):
336
  cell_value = str(cell_value)
337
  if cell_value.startswith("L") and cell_value.endswith("L"):
338
  cell_value_clipped = cell_value[1:-1]
 
 
339
  if cell_value_clipped == str(member_id): # str(member_id) needed, it is int by default
340
  print("test4")
341
  # if found, update that row...
@@ -352,6 +358,7 @@ async def add_exp(member_id):
352
 
353
  # str -> int temporarily for adding
354
  new_xp = int(old_xp) + XP_PER_MESSAGE
 
355
 
356
  total_exp = global_df.loc[index, 'total_exp']
357
  hub_xp = global_df.loc[index, 'hub_exp']
@@ -375,7 +382,7 @@ async def add_exp(member_id):
375
  total_exp = int(new_xp)
376
 
377
  # total v
378
- current_level = calculate_level(total_exp)
379
 
380
  # convert back to string + google sheet proofing
381
  new_xp = str(new_xp)
@@ -546,29 +553,36 @@ async def on_message(message):
546
  invite_message = "Click to join our community org on the HF Hub!"
547
  try:
548
  if message.author.id not in bot_ids: # could change to if author does not have bot role (roleid)
549
- print(f"adding exp from message {message.author}")
550
- await asyncio.sleep(0.1)
551
- await add_exp(message.author.id)
552
-
553
- # add check for verification
554
- if message.content.find("!help") != -1:
555
- await message.channel.send(
556
- "To verify your πŸ€— account, generate a login link in the verification channel! "
557
- )
558
  await bot.process_commands(message)
559
  except Exception as e:
560
  print(f"on_message Error: {e}")
561
 
562
-
563
  @bot.event
564
  async def on_reaction_add(reaction, user):
565
  try:
566
  if user.id not in bot_ids:
567
- print(f"adding exp from react {user}")
568
  await asyncio.sleep(0.1)
569
- if not isinstance(reaction.message.channel, discord.DMChannel) and reaction.message.author.id != user.id: # can't earn exp from reacting in bot DMs, which is harder to track, and can't earn while self-reacting, which is abuseable
570
- await add_exp(reaction.message.author.id)
571
- await asyncio.sleep(0.1)
 
 
 
 
 
 
 
 
572
 
573
  except Exception as e:
574
  print(f"on_reaction_add Error: {e}")
 
3
  import csv
4
  import json
5
  import time
6
+ import math
7
  import random
8
  import asyncio
9
  import discord
 
45
  # Dictionary to store user IDs and their corresponding unique strings
46
  user_tokens = {}
47
 
48
+ EXPONENT = 3
49
+
50
 
51
  """"""
52
  XP_PER_MESSAGE = 10 # 100k messages = 1M exp = lvl 100
 
247
  #asyncio.get_event_loop().run_forever()
248
 
249
 
250
+ def calculate_level(xp, n=EXPONENT):
251
+ return int(xp ** (1 / n))
252
 
253
 
254
+ def calculate_xp(old_xp, n=EXPONENT):
255
+ new_level = (old_xp ** (1 / 3)) ** n
256
+ return new_level
257
 
258
 
259
  async def add_exp(member_id):
 
340
  cell_value = str(cell_value)
341
  if cell_value.startswith("L") and cell_value.endswith("L"):
342
  cell_value_clipped = cell_value[1:-1]
343
+ isnt_samusenps = member_id != 981178585790423060
344
+ EXPONEND = 3 if isnt_samusenps else 3 - 5e-2 # give samu a boost :spinnyhat:
345
  if cell_value_clipped == str(member_id): # str(member_id) needed, it is int by default
346
  print("test4")
347
  # if found, update that row...
 
358
 
359
  # str -> int temporarily for adding
360
  new_xp = int(old_xp) + XP_PER_MESSAGE
361
+ new_xp = calculate_xp(new_xp, EXPONEND)
362
 
363
  total_exp = global_df.loc[index, 'total_exp']
364
  hub_xp = global_df.loc[index, 'hub_exp']
 
382
  total_exp = int(new_xp)
383
 
384
  # total v
385
+ current_level = calculate_level(total_exp, EXPONEND)
386
 
387
  # convert back to string + google sheet proofing
388
  new_xp = str(new_xp)
 
553
  invite_message = "Click to join our community org on the HF Hub!"
554
  try:
555
  if message.author.id not in bot_ids: # could change to if author does not have bot role (roleid)
556
+ if message.guild is not None: # can't earn exp from messaging in bot DMs, which is harder to track
557
+ print(f"adding exp from message {message.author}")
558
+ await add_exp(message.author.id)
559
+ await asyncio.sleep(0.1)
560
+ else:
561
+ print("Messaged in DM channel, skipping..")
562
+ await asyncio.sleep(0.1)
563
+
 
564
  await bot.process_commands(message)
565
  except Exception as e:
566
  print(f"on_message Error: {e}")
567
 
568
+
569
  @bot.event
570
  async def on_reaction_add(reaction, user):
571
  try:
572
  if user.id not in bot_ids:
573
+ message = reaction.message
574
  await asyncio.sleep(0.1)
575
+ if message.guild is not None: # can't earn exp from reacting in bot DMs, which is harder to track
576
+ if message.author.id != user.id: # can't earn while self-reacting, which is abuseable
577
+ print(f"adding exp from react {user}")
578
+ await add_exp(message.author.id)
579
+ await asyncio.sleep(0.1)
580
+ else:
581
+ print("Self-reacted, skipping..")
582
+ await asyncio.sleep(0.1)
583
+ else:
584
+ print("Reacted in DM channel, skipping..")
585
+ await asyncio.sleep(0.1)
586
 
587
  except Exception as e:
588
  print(f"on_reaction_add Error: {e}")