2020-08-31 19:58:01 +02:00
import asyncio
from redbot . core import commands
from redbot . core import Config , checks
from discord import TextChannel
2020-08-31 23:56:09 +02:00
import discord
2020-08-31 19:58:01 +02:00
import traceback
import requests
class WynncraftCog ( commands . Cog ) :
2020-08-31 20:03:24 +02:00
def __init__ ( self , bot ) :
self . bot = bot
2020-08-31 19:58:01 +02:00
self . config = Config . get_conf ( self , identifier = 48775419874 )
default_guild = {
2020-08-31 23:56:09 +02:00
" guild_name " : None , # OK
" ping_levels " : False , # OK
" ping_channel " : None , # OK
" role_levels " : [
750098524976185525 , # 0-9
750098542802239488 , # 10-19
750098546883166292 , # 20-29
750098551756947496 , # 30-39
750098557444292740 , # 40-49
750098560732889088 , # 50-59
750098568194424872 , # 60-69
750098573353418822 , # 70-79
750098579535822918 , # 80-89
750098584082448434 , # 90-99
750098593976811550 , # 100+
] ,
" role_class " : {
" mage " : 750097053840965752 ,
" assassin " : 750097058362425417 ,
" shaman " : 750097056093438012 ,
" archer " : 750097050867204246 ,
" warrior " : 750097044433272833
} ,
" update_msg " : 123456
2020-08-31 19:58:01 +02:00
}
2020-08-31 20:25:45 +02:00
default_global = {
" log " : True
}
2020-08-31 19:58:01 +02:00
self . config . register_guild ( * * default_guild )
2020-08-31 20:25:45 +02:00
self . config . register_global ( * * default_global )
2020-08-31 19:58:01 +02:00
@commands.command ( )
@checks.admin_or_permissions ( manage_guild = True )
2020-08-31 23:56:09 +02:00
async def ping_channel ( self , ctx , channel : TextChannel ) :
i = channel . id
await self . config . guild ( ctx . guild ) . ping_channel . set ( i )
await self . config . guild ( ctx . guild ) . ping_levels . set ( True )
await ctx . send ( " Les messages de montée de niveau seront désormais envoyés dans %s " % channel . mention )
2020-08-31 19:58:01 +02:00
@commands.command ( )
@checks.admin_or_permissions ( manage_guild = True )
2020-08-31 23:56:09 +02:00
async def ping_levels ( self , ctx , state ) :
if state == " true " or state == " on " :
await self . config . ping_levels . set ( True )
await ctx . send ( " :white_check_mark: Activé! " )
elif state == " false " or state == " off " :
await self . config . ping_levels . set ( False )
await ctx . send ( " :white_check_mark: Désactivé! " )
2020-08-31 19:58:01 +02:00
else :
2020-08-31 23:56:09 +02:00
await ctx . send ( " :x: " )
2020-08-31 19:58:01 +02:00
@commands.command ( )
@checks.admin_or_permissions ( manage_guild = True )
2020-08-31 23:56:09 +02:00
async def set_guild ( self , ctx , guild_name ) :
await self . config . guild ( ctx . guild ) . guild_name . set ( guild_name )
await ctx . send ( " :white_check_mark: Votre guilde est désormais ** %s ** " % guild_name )
2020-08-31 19:58:01 +02:00
2020-08-31 20:25:45 +02:00
@commands.command ( )
@checks.is_owner ( )
async def log ( self , ctx , state ) :
state = state . lower ( )
if state == " true " or state == " on " :
await self . config . log . set ( True )
await ctx . send ( " :white_check_mark: " )
2020-08-31 23:56:09 +02:00
print ( " Logs on " )
2020-08-31 20:25:45 +02:00
elif state == " false " or state == " off " :
await self . config . log . set ( False )
await ctx . send ( " :white_check_mark: " )
2020-08-31 23:56:09 +02:00
print ( " Logs off " )
2020-08-31 20:25:45 +02:00
else :
await ctx . send ( " :x: " )
2020-08-31 20:26:35 +02:00
async def _log ( self , s ) :
2020-08-31 20:25:45 +02:00
if await self . config . log ( ) :
print ( s )
2020-08-31 19:58:01 +02:00
async def loop ( self ) :
await self . bot . wait_until_ready ( )
last_status = { }
while self is self . bot . get_cog ( " WynncraftCog " ) :
2020-08-31 20:26:35 +02:00
await self . _log ( " Looping guilds " )
2020-08-31 19:58:01 +02:00
async for guild in self . bot . fetch_guilds ( limit = 150 ) :
2020-08-31 23:56:09 +02:00
roles_combat_level = await self . config . guild ( guild ) . role_levels ( )
2020-08-31 19:58:01 +02:00
guild_id = guild . id
2020-08-31 20:26:35 +02:00
await self . _log ( " Loop id %s " % guild_id )
2020-08-31 19:58:01 +02:00
try :
2020-08-31 23:56:09 +02:00
guild_name = await self . config . guild ( guild ) . guild_name ( )
2020-08-31 23:59:10 +02:00
if not guild_name :
continue
2020-08-31 23:56:09 +02:00
r = requests . get ( " https://api.wynncraft.com/public_api.php?action=guildStats&command= %s " % guild_name ) . json ( )
for member in r [ " members " ] :
member_name = member [ " name " ]
await self . _log ( " calling API for player %s " % member_name )
r = requests . get ( " https://api.wynncraft.com/v2/player/ %s /stats " % member_name ) . json ( )
max_combat_lvl_class = None
2020-09-01 00:07:20 +02:00
if not r [ " data " ] :
await self . _log ( " %s had data %s " % ( member_name , r [ " data " ] ) )
continue
2020-08-31 23:56:09 +02:00
for cl in r [ " data " ] [ 0 ] [ " classes " ] :
if guild_id not in last_status :
last_status [ guild_id ] = { }
if member_name not in last_status [ guild_id ] :
last_status [ guild_id ] [ member_name ] = { }
if cl [ " name " ] not in last_status [ guild_id ] [ member_name ] :
last_status [ guild_id ] [ member_name ] [ cl [ " name " ] ] = cl
# ping level up
ping_channel_id = await self . config . guild ( guild ) . ping_channel ( )
if await self . config . guild ( guild ) . ping_levels ( ) and ping_channel_id :
await self . _log ( " Checking for level up " )
if cl [ " professions " ] [ " combat " ] [ " level " ] > last_status [ guild_id ] [ member_name ] [ cl [ " name " ] ] [ " professions " ] [ " combat " ] [ " level " ] :
ping_channel = self . bot . get_channel ( ping_channel_id )
await ping_channel . send ( " :high_brightness: %s a level up au niveau %s ! GG! " % ( member_name , cl [ " professions " ] [ " combat " ] [ " level " ] ) )
2020-08-31 20:06:55 +02:00
else :
2020-08-31 23:56:09 +02:00
await self . _log ( " Player %s had last level %s and current %s " % ( member_name , last_status [ guild_id ] [ member_name ] [ cl [ " name " ] ] [ " professions " ] [ " combat " ] [ " level " ] , cl [ " professions " ] [ " combat " ] [ " level " ] ) )
else :
await self . _log ( " Not checking for level up " )
last_status [ guild_id ] [ member_name ] [ cl [ " name " ] ] = cl
# get max_combat_lvl_class
2020-09-01 00:00:46 +02:00
if not max_combat_lvl_class or cl [ " professions " ] [ " combat " ] [ " level " ] > max_combat_lvl_class [ " professions " ] [ " combat " ] [ " level " ] :
2020-09-01 00:02:54 +02:00
await self . _log ( " cl: %s , max_combat_lvl_class: %s " % ( cl , max_combat_lvl_class ) )
2020-08-31 23:56:09 +02:00
max_combat_lvl_class = cl
await self . _log ( " Setting max_combat_lvl_class role " )
# set max_combat_lvl_class role
discord_member = discord . utils . find ( lambda m : m . display_name == member_name , guild . members )
if max_combat_lvl_class and discord_member :
await self . _log ( " max_combat_lvl_class and discord_member True " )
max_combat_lvl = max_combat_lvl_class [ " professions " ] [ " combat " ] [ " level " ]
combat_role_index = max_combat_lvl / / 10
if combat_role_index > 10 : combat_role_index = 10
combat_role_id = roles_combat_level [ combat_role_index ]
combat_role = self . bot . get_role ( combat_role_id )
if combat_role not in discord_member . roles :
await self . _log ( " Add role: %s " % combat_role )
# await discord_member.add_roles(combat_role)
roles_to_remove = filter ( lambda role : role . id in roles_combat_level and role . id != combat_role_id , discord_member . roles )
if roles_to_remove :
# await discord_member.remove_roles(roles_to_remove)
await self . _log ( " remove roles: %s " % roles_to_remove )
else :
2020-09-01 00:10:15 +02:00
await self . _log ( " max_combat_lvl_class: %s , discord_member: %s (name: %s ) " % ( max_combat_lvl_class , discord_member , member_name ) )
await self . _log ( guild . members )
2020-08-31 19:58:01 +02:00
except :
2020-08-31 20:25:45 +02:00
if await self . config . log ( ) :
traceback . print_exc ( )
2020-08-31 19:58:01 +02:00
await asyncio . sleep ( 30 )