11import asyncio
2+ import logging
23import typing as t
34from pathlib import Path
45
1011from ..common import formatter
1112
1213_ = Translator ("LevelUp" , __file__ )
14+ log = logging .getLogger ("red.levelup.dashboard" )
1315
1416
1517def dashboard_page (* args , ** kwargs ):
@@ -23,7 +25,9 @@ def decorator(func: t.Callable):
2325class DashboardIntegration (MixinMeta ):
2426 @commands .Cog .listener ()
2527 async def on_dashboard_cog_add (self , dashboard_cog : commands .Cog ) -> None :
28+ log .info ("Dashboard cog added, registering third party." )
2629 dashboard_cog .rpc .third_parties_handler .add_third_party (self )
30+ logging .getLogger ("werkzeug" ).setLevel (logging .WARNING )
2731
2832 async def get_dashboard_leaderboard (
2933 self ,
@@ -34,6 +38,30 @@ async def get_dashboard_leaderboard(
3438 query : t .Optional [str ] = None ,
3539 ** kwargs ,
3640 ):
41+ """
42+ kwargs = {
43+ "user_id": int,
44+ "guild_id": int,
45+ "method": str, # GET or POST
46+ "request_url": str,
47+ "cxrf_token": str,
48+ "wtf_csrf_secret_key": bytes,
49+ "extra_kwargs": MultiDict,
50+ "data": {
51+ "form": ImmutableMultiDict,
52+ "json": ImmutableMultiDict,
53+ }
54+ "lang_code": str,
55+ "Form": FlaskForm,
56+ "DpyObjectConverter": DpyObjectConverter,
57+ "get_sorted_channels": Callable,
58+ "get_sorted_roles": Callable,
59+ "Pagination": Pagination,
60+ }
61+ """
62+ log .warning ("Kwargs" )
63+ for k , v in kwargs .items ():
64+ log .warning (f"{ k } : { v } " )
3765 conf = self .db .get_conf (guild )
3866 if lbtype == "weekly" :
3967 if not conf .weeklysettings .on :
@@ -49,8 +77,32 @@ async def get_dashboard_leaderboard(
4977 "error_message" : _ ("There is no data for the weekly leaderboard yet, please chat a bit first." ),
5078 }
5179
52- source_path = Path (__file__ ).parent / "templates" / "leaderboard.html"
53- payload : dict = await asyncio .to_thread (
80+ parent = Path (__file__ ).parent
81+
82+ source_path = parent / "templates" / "leaderboard.html"
83+ static_dir = parent / "static"
84+ js_path = static_dir / "js" / "leaderboard.js"
85+ css_path = static_dir / "css" / "leaderboard.css"
86+
87+ # Inject JS and CSS into the HTML source for full page loads
88+ source = (
89+ f"<style>\n { css_path .read_text ()} \n </style>\n \n "
90+ + source_path .read_text ().strip ()
91+ + f"\n \n <script>\n { js_path .read_text ()} \n </script>"
92+ )
93+
94+ """
95+ {
96+ "title": str,
97+ "description": str,
98+ "stat": str,
99+ "stats": [{"position": int, "name": str, "id": int, "stat": str}]
100+ "total": str,
101+ "type": leaderboard type, // lb or weekly
102+ "user_position": int, // Index of the user in the leaderboard
103+ }
104+ """
105+ res : dict = await asyncio .to_thread (
54106 formatter .get_leaderboard ,
55107 bot = self .bot ,
56108 guild = guild ,
@@ -63,40 +115,40 @@ async def get_dashboard_leaderboard(
63115 dashboard = True ,
64116 query = query ,
65117 )
66- # if not payload["stats"]:
67- # return {
68- # "status": 1,
69- # "error_title": _("No stats available"),
70- # "error_message": _("There is no data for the leaderboard yet, please chat a bit first."),
71- # }
72-
73- return {
118+ data = {
119+ "user_id" : user .id ,
120+ "users" : res ["stats" ],
121+ "stat" : stat ,
122+ "total" : res ["description" ].replace ("`" , "" ),
123+ "type" : lbtype ,
124+ "statname" : res ["stat" ],
125+ "query" : query if query is not None else "" , # Changed to prevent None
126+ "page" : int (kwargs ["extra_kwargs" ].get ("page" , 1 )), # Ensure it's an integer
127+ }
128+ content = {
74129 "status" : 0 ,
75130 "web_content" : {
76- "source" : source_path .read_text (),
77- "users" : kwargs ["Pagination" ].from_list (
78- payload ["stats" ],
79- per_page = kwargs ["extra_kwargs" ].get ("per_page" ),
80- page = kwargs ["extra_kwargs" ].get ("page" ),
81- default_per_page = 100 ,
82- ),
131+ "source" : source ,
132+ "data" : data ,
83133 "stat" : stat ,
84- "total" : payload ["description" ].replace ("`" , "" ),
85- "statname" : payload ["stat" ],
134+ "total" : res ["description" ].replace ("`" , "" ),
135+ "statname" : res ["stat" ],
86136 "query" : query ,
137+ "current_user" : user ,
87138 },
88139 }
140+ return content
89141
90142 @dashboard_page (name = "leaderboard" , description = "Display the guild leaderboard." )
91143 async def leaderboard_page (
92144 self , user : discord .User , guild : discord .Guild , stat : str = None , query : t .Optional [str ] = None , ** kwargs
93145 ) -> t .Dict [str , t .Any ]:
94146 stat = stat if stat is not None and stat in {"exp" , "messages" , "voice" , "stars" } else "exp"
95- return await self .get_dashboard_leaderboard (user , guild , "normal " , stat , query , ** kwargs )
147+ return await self .get_dashboard_leaderboard (user , guild , "lb " , stat , query , ** kwargs )
96148
97149 @dashboard_page (name = "weekly" , description = "Display the guild weekly leaderboard." )
98150 async def weekly_page (
99- self , user : discord .User , guild : discord .Guild , stat : str = None , ** kwargs
151+ self , user : discord .User , guild : discord .Guild , stat : str = None , query : t . Optional [ str ] = None , ** kwargs
100152 ) -> t .Dict [str , t .Any ]:
101153 stat = stat if stat is not None and stat in {"exp" , "messages" , "voice" , "stars" } else "exp"
102- return await self .get_dashboard_leaderboard (user , guild , "weekly" , stat , ** kwargs )
154+ return await self .get_dashboard_leaderboard (user , guild , "weekly" , stat , query , ** kwargs )
0 commit comments