@@ -424,6 +424,120 @@ async def help(router, name, params, channel, userdata, rank):
424424 await router .send_message (channel , name + ": Invalid command provided" )
425425
426426
427+ async def total (router , name , params , channel , userdata , rank ):
428+ if len (params ) == 2 :
429+ ver = params [1 ]
430+ if ver not in versions :
431+ await router .send_message (channel , f"{ name } : MC version not found in NEM." )
432+ return
433+ jsonres = await fetch_json (f"https://bot.notenoughmods.com/{ urlquote (ver )} .json" , cache = True )
434+ if jsonres is None :
435+ await router .send_message (channel , f"{ name } : Could not fetch the list." )
436+ return
437+ count_msg = f"{ PURPLE } { len (jsonres )} { COLOUREND } mods in { BOLD } { BLUE } { ver } { COLOUREND } { BOLD } "
438+ await router .send_message (channel , count_msg )
439+ else :
440+ count = 0
441+ for ver in versions :
442+ jsonres = await fetch_json (f"https://bot.notenoughmods.com/{ urlquote (ver )} .json" , cache = True )
443+ if jsonres is not None :
444+ count += len (jsonres )
445+ await router .send_message (channel , f"{ PURPLE } { count } { COLOUREND } mods total across { len (versions )} versions" )
446+
447+
448+ async def missmodid (router , name , params , channel , userdata , rank ):
449+ if len (params ) != 2 :
450+ await router .send_message (channel , f"{ name } : Usage: =nem missmodid <version>" )
451+ return
452+
453+ ver = params [1 ]
454+ if ver not in versions :
455+ await router .send_message (channel , f"{ name } : MC version not found in NEM." )
456+ return
457+
458+ jsonres = await fetch_json (f"https://bot.notenoughmods.com/{ urlquote (ver )} .json" , cache = True )
459+ if jsonres is None :
460+ await router .send_message (channel , f"{ name } : Could not fetch the list." )
461+ return
462+
463+ missing = [mod ["name" ] for mod in jsonres if mod .get ("modid" , "" ) == "" ]
464+
465+ if not missing :
466+ await router .send_message (channel , f"{ name } : All mods in { BOLD } { BLUE } { ver } { COLOUREND } { BOLD } have a modid set." )
467+ elif len (missing ) <= 5 :
468+ for mod_name in missing :
469+ await router .send_message (channel , f"[{ BLUE } { ver } { COLOUREND } ] { mod_name } " )
470+ elif len (missing ) <= 20 :
471+ await router .send_message (channel , f"{ len (missing )} mod(s) missing modid. Sending via notice..." )
472+ for mod_name in missing :
473+ await router .send_notice (name , f"[{ BLUE } { ver } { COLOUREND } ] { mod_name } " )
474+ else :
475+ msg = f"{ len (missing )} mod(s) missing modid in { BOLD } { BLUE } { ver } { COLOUREND } { BOLD } ."
476+ await router .send_message (channel , msg )
477+
478+
479+ async def blinks (router , name , params , channel , userdata , rank ):
480+ if len (params ) != 2 :
481+ await router .send_message (channel , f"{ name } : Usage: =nem blinks <version>" )
482+ return
483+
484+ ver = params [1 ]
485+ if ver not in versions :
486+ await router .send_message (channel , f"{ name } : MC version not found in NEM." )
487+ return
488+
489+ jsonres = await fetch_json (f"https://bot.notenoughmods.com/{ urlquote (ver )} .json" , cache = True )
490+ if jsonres is None :
491+ await router .send_message (channel , f"{ name } : Could not fetch the list." )
492+ return
493+
494+ await router .send_message (channel , f"[{ BLUE } { ver } { COLOUREND } ] Checking { len (jsonres )} mod links..." )
495+
496+ counts = {}
497+ badmods = []
498+ index = 0
499+
500+ for mod in jsonres :
501+ if mod .get ("longurl" , "" ) != "" :
502+ try :
503+ async with session .head (
504+ mod ["longurl" ],
505+ timeout = aiohttp .ClientTimeout (total = 10 ),
506+ allow_redirects = True ,
507+ ) as resp :
508+ code = resp .status
509+ counts [code ] = counts .get (code , 0 ) + 1
510+ if code >= 400 :
511+ badmods .append ({"name" : mod ["name" ], "reason" : code })
512+ except Exception as e :
513+ reason = type (e ).__name__
514+ counts [reason ] = counts .get (reason , 0 ) + 1
515+ badmods .append ({"name" : mod ["name" ], "reason" : reason })
516+
517+ index += 1
518+ if index % 50 == 0 :
519+ await router .send_message (channel , f"[{ BLUE } { ver } { COLOUREND } ] { index } mods processed..." )
520+
521+ if not badmods :
522+ await router .send_message (channel , f"[{ BLUE } { ver } { COLOUREND } ] No broken links found." )
523+ elif len (badmods ) <= 5 :
524+ await router .send_message (channel , f"{ len (badmods )} broken link(s) found:" )
525+ for mod in badmods :
526+ await router .send_message (channel , f"[{ BLUE } { ver } { COLOUREND } ] { mod ['name' ]} ({ mod ['reason' ]} )" )
527+ elif len (badmods ) <= 20 :
528+ await router .send_message (channel , f"{ len (badmods )} broken link(s) found. Sending via notice..." )
529+ for mod in badmods :
530+ await router .send_notice (name , f"[{ BLUE } { ver } { COLOUREND } ] { mod ['name' ]} ({ mod ['reason' ]} )" )
531+ else :
532+ msg = f"{ len (badmods )} broken link(s) found in { BOLD } { BLUE } { ver } { COLOUREND } { BOLD } ."
533+ await router .send_message (channel , msg )
534+
535+ await router .send_message (
536+ channel ,
537+ f"[{ BLUE } { ver } { COLOUREND } ] Complete. { index } mods processed. Results: { counts } " ,
538+ )
539+
540+
427541async def force_cache_redownload (router , name , params , channel , userdata , rank ):
428542 if rank >= Permission .ADMIN :
429543 for ver in versions :
@@ -446,6 +560,9 @@ async def force_cache_redownload(router, name, params, channel, userdata, rank):
446560 "help" : help ,
447561 "setlist" : setlist ,
448562 "compare" : compare ,
563+ "total" : total ,
564+ "missmodid" : missmodid ,
565+ "blinks" : blinks ,
449566 "forceredownload" : force_cache_redownload ,
450567}
451568
@@ -472,6 +589,18 @@ async def force_cache_redownload(router, name, params, channel, userdata, rank):
472589 "Compares the NEMP entries for two different MC versions and says how many mods "
473590 "haven't been updated to the new version." ,
474591 ],
592+ "total" : [
593+ "=nem total [version]" ,
594+ "Returns the total number of mods, optionally for a specific MC version." ,
595+ ],
596+ "missmodid" : [
597+ "=nem missmodid <version>" ,
598+ "Returns mods without a modid set for the given MC version." ,
599+ ],
600+ "blinks" : [
601+ "=nem blinks <version>" ,
602+ "Checks each mod link for broken URLs (non-OK HTTP status codes)." ,
603+ ],
475604}
476605
477606COMMANDS = {
0 commit comments