Update main.py
Browse files
main.py
CHANGED
@@ -50,6 +50,8 @@ SERVER_SCAMMER_SHEET = "Server Scammer Files"
|
|
50 |
SERVER_SCAMMER_RANGE = "B6:F"
|
51 |
DWC_SHEET = "DWC Servers / Users"
|
52 |
DWC_RANGE = "B6:G"
|
|
|
|
|
53 |
|
54 |
# Sheet Names and Ranges within VALUES_DUPE_SPREADSHEET_ID
|
55 |
DUPE_LIST_SHEET = "Dupe List"
|
@@ -67,8 +69,7 @@ CACHE_UPDATE_INTERVAL_SECONDS = int(os.getenv('CACHE_UPDATE_INTERVAL_SECONDS', 6
|
|
67 |
# Webhook URLs
|
68 |
SCAMMER_WEBHOOK_URL = os.getenv("SCAMMER_WEBHOOK_URL")
|
69 |
VALUE_WEBHOOK_URL = os.getenv("VALUE_WEBHOOK_URL")
|
70 |
-
|
71 |
-
DUPE_CHECK_WEBHOOK_URL = os.getenv("WEBHOOK_URL")
|
72 |
|
73 |
|
74 |
# --- Global Cache ---
|
@@ -78,6 +79,7 @@ cache = {
|
|
78 |
"user_scammers": [],
|
79 |
"server_scammers": [],
|
80 |
"dwc": [],
|
|
|
81 |
"dupes": [], # List of duped usernames
|
82 |
"last_updated": None, # Timestamp of the last successful/partial update
|
83 |
"is_ready": False, # Is the cache populated at least once?
|
@@ -376,6 +378,33 @@ def process_dwc_data(values): # For DWC Sheet
|
|
376 |
processed_data.append(processed_item)
|
377 |
return processed_data
|
378 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
379 |
def process_dupe_list_data(values): # For Dupe List Sheet
|
380 |
if not values: return []
|
381 |
# Expected range like B2:B
|
@@ -513,16 +542,19 @@ async def update_cache_periodically():
|
|
513 |
f"{quote_sheet_name(USER_SCAMMER_SHEET)}!{USER_SCAMMER_RANGE}",
|
514 |
f"{quote_sheet_name(SERVER_SCAMMER_SHEET)}!{SERVER_SCAMMER_RANGE}",
|
515 |
f"{quote_sheet_name(DWC_SHEET)}!{DWC_RANGE}",
|
|
|
516 |
]
|
517 |
scammer_dwc_processor_map = {
|
518 |
USER_SCAMMER_SHEET: process_user_scammer_data,
|
519 |
SERVER_SCAMMER_SHEET: process_server_scammer_data,
|
520 |
DWC_SHEET: process_dwc_data,
|
|
|
521 |
}
|
522 |
scammer_dwc_target_key_map = {
|
523 |
USER_SCAMMER_SHEET: "user_scammers",
|
524 |
SERVER_SCAMMER_SHEET: "server_scammers",
|
525 |
DWC_SHEET: "dwc",
|
|
|
526 |
}
|
527 |
|
528 |
values_dupes_ranges = [f"{quote_sheet_name(DUPE_LIST_SHEET)}!{DUPE_LIST_RANGE}"]
|
@@ -1024,7 +1056,8 @@ async def get_scammers():
|
|
1024 |
return {
|
1025 |
"users": cache.get("user_scammers", []),
|
1026 |
"servers": cache.get("server_scammers", []),
|
1027 |
-
"dwc": cache.get("dwc", [])
|
|
|
1028 |
}
|
1029 |
|
1030 |
@app.get("/api/dupes")
|
|
|
50 |
SERVER_SCAMMER_RANGE = "B6:F"
|
51 |
DWC_SHEET = "DWC Servers / Users"
|
52 |
DWC_RANGE = "B6:G"
|
53 |
+
TRUSTED_SHEET = "Trusted Users / Servers"
|
54 |
+
TRUSTED_RANGE = "B6:E"
|
55 |
|
56 |
# Sheet Names and Ranges within VALUES_DUPE_SPREADSHEET_ID
|
57 |
DUPE_LIST_SHEET = "Dupe List"
|
|
|
69 |
# Webhook URLs
|
70 |
SCAMMER_WEBHOOK_URL = os.getenv("SCAMMER_WEBHOOK_URL")
|
71 |
VALUE_WEBHOOK_URL = os.getenv("VALUE_WEBHOOK_URL")
|
72 |
+
DUPE_CHECK_WEBHOOK_URL = os.getenv("DUPE_CHECK_WEBHOOK_URL")
|
|
|
73 |
|
74 |
|
75 |
# --- Global Cache ---
|
|
|
79 |
"user_scammers": [],
|
80 |
"server_scammers": [],
|
81 |
"dwc": [],
|
82 |
+
"trusted": [], # List of trusted users/servers
|
83 |
"dupes": [], # List of duped usernames
|
84 |
"last_updated": None, # Timestamp of the last successful/partial update
|
85 |
"is_ready": False, # Is the cache populated at least once?
|
|
|
378 |
processed_data.append(processed_item)
|
379 |
return processed_data
|
380 |
|
381 |
+
def process_trusted_data(values): # For Trusted Users/Servers Sheet
|
382 |
+
if not values: return []
|
383 |
+
processed_data = []
|
384 |
+
for row in values: # Expected range like B6:E
|
385 |
+
if not row or len(row) < 2: continue
|
386 |
+
# Indices based on B6:E (0-indexed from B)
|
387 |
+
discord_id = clean_string_optional(row[0]) if len(row) > 0 else None # Col B
|
388 |
+
discord_username = clean_string_optional(row[1]) if len(row) > 1 else None # Col C
|
389 |
+
discord_server_id = clean_string_optional(row[2]) if len(row) > 2 else None # Col D
|
390 |
+
roblox_username = clean_string_optional(row[3]) if len(row) > 3 else None # Col E
|
391 |
+
|
392 |
+
# Skip if all identifiers are missing
|
393 |
+
if not discord_id and not discord_username and not discord_server_id and not roblox_username: continue
|
394 |
+
# Skip if it looks like a header row
|
395 |
+
if str(discord_id).lower() == 'discord id' or str(discord_username).lower() == 'discord username':
|
396 |
+
continue
|
397 |
+
|
398 |
+
processed_item = {
|
399 |
+
'discord_id': discord_id,
|
400 |
+
'discord_username': discord_username,
|
401 |
+
'discord_server_id': discord_server_id,
|
402 |
+
'roblox_username': roblox_username,
|
403 |
+
'roblox_avatar_url': None # Will be filled later
|
404 |
+
}
|
405 |
+
processed_data.append(processed_item)
|
406 |
+
return processed_data
|
407 |
+
|
408 |
def process_dupe_list_data(values): # For Dupe List Sheet
|
409 |
if not values: return []
|
410 |
# Expected range like B2:B
|
|
|
542 |
f"{quote_sheet_name(USER_SCAMMER_SHEET)}!{USER_SCAMMER_RANGE}",
|
543 |
f"{quote_sheet_name(SERVER_SCAMMER_SHEET)}!{SERVER_SCAMMER_RANGE}",
|
544 |
f"{quote_sheet_name(DWC_SHEET)}!{DWC_RANGE}",
|
545 |
+
f"{quote_sheet_name(TRUSTED_SHEET)}!{TRUSTED_RANGE}",
|
546 |
]
|
547 |
scammer_dwc_processor_map = {
|
548 |
USER_SCAMMER_SHEET: process_user_scammer_data,
|
549 |
SERVER_SCAMMER_SHEET: process_server_scammer_data,
|
550 |
DWC_SHEET: process_dwc_data,
|
551 |
+
TRUSTED_SHEET: process_trusted_data,
|
552 |
}
|
553 |
scammer_dwc_target_key_map = {
|
554 |
USER_SCAMMER_SHEET: "user_scammers",
|
555 |
SERVER_SCAMMER_SHEET: "server_scammers",
|
556 |
DWC_SHEET: "dwc",
|
557 |
+
TRUSTED_SHEET: "trusted",
|
558 |
}
|
559 |
|
560 |
values_dupes_ranges = [f"{quote_sheet_name(DUPE_LIST_SHEET)}!{DUPE_LIST_RANGE}"]
|
|
|
1056 |
return {
|
1057 |
"users": cache.get("user_scammers", []),
|
1058 |
"servers": cache.get("server_scammers", []),
|
1059 |
+
"dwc": cache.get("dwc", []),
|
1060 |
+
"trusted": cache.get("trusted", [])
|
1061 |
}
|
1062 |
|
1063 |
@app.get("/api/dupes")
|