2024-06-18 23:50:02 +12:00
using EllieBot.Modules.Administration.Services ;
namespace EllieBot.Modules.Administration ;
public partial class Administration
{
public partial class ReactionRoleCommands : EllieModule
{
private readonly IReactionRoleService _rero ;
public ReactionRoleCommands ( IReactionRoleService rero )
{
_rero = rero ;
}
[Cmd]
[RequireContext(ContextType.Guild)]
[UserPerm(GuildPerm.ManageRoles)]
[BotPerm(GuildPerm.ManageRoles)]
public async Task ReRoAdd (
ulong messageId ,
string emoteStr ,
IRole role ,
int group = 0 ,
int levelReq = 0 )
{
if ( group < 0 )
return ;
if ( levelReq < 0 )
return ;
var msg = await ctx . Channel . GetMessageAsync ( messageId ) ;
if ( msg is null )
{
2024-07-29 19:00:25 +12:00
await Response ( ) . Error ( strs . rero_message_not_found ) . SendAsync ( ) ;
2024-06-18 23:50:02 +12:00
return ;
}
if ( ctx . User . Id ! = ctx . Guild . OwnerId
& & ( ( IGuildUser ) ctx . User ) . GetRoles ( ) . Max ( x = > x . Position ) < = role . Position )
{
await Response ( ) . Error ( strs . hierarchy ) . SendAsync ( ) ;
return ;
}
var emote = emoteStr . ToIEmote ( ) ;
await msg . AddReactionAsync ( emote ) ;
var res = await _rero . AddReactionRole ( ctx . Guild ,
msg ,
emoteStr ,
role ,
group ,
levelReq ) ;
await res . Match (
_ = > ctx . OkAsync ( ) ,
2024-06-27 18:23:14 +12:00
async fl = >
2024-06-18 23:50:02 +12:00
{
_ = msg . RemoveReactionAsync ( emote , ctx . Client . CurrentUser ) ;
2024-06-27 18:23:14 +12:00
await Response ( ) . Pending ( strs . feature_limit_reached_owner ) . SendAsync ( ) ;
2024-06-18 23:50:02 +12:00
} ) ;
}
[Cmd]
[RequireContext(ContextType.Guild)]
[UserPerm(GuildPerm.ManageRoles)]
[BotPerm(GuildPerm.ManageRoles)]
public async Task ReRoList ( int page = 1 )
{
if ( - - page < 0 )
return ;
var allReros = await _rero . GetReactionRolesAsync ( ctx . Guild . Id ) ;
await Response ( )
. Paginated ( )
. Items ( allReros . OrderBy ( x = > x . Group ) . ToList ( ) )
. PageSize ( 10 )
. CurrentPage ( page )
. Page ( ( items , _ ) = >
{
var embed = _sender . CreateEmbed ( )
. WithOkColor ( ) ;
var content = string . Empty ;
foreach ( var g in items
. GroupBy ( x = > x . MessageId )
. OrderBy ( x = > x . Key ) )
{
var messageId = g . Key ;
content + =
$"[{messageId}](https://discord.com/channels/{ctx.Guild.Id}/{g.First().ChannelId}/{g.Key})\n" ;
var groupGroups = g . GroupBy ( x = > x . Group ) ;
foreach ( var ggs in groupGroups )
{
content + = $"`< {(g.Key == 0 ? (" Not Exclusive ( Group 0 ) ") : ($" Group { ggs . Key } "))} >`\n" ;
foreach ( var rero in ggs )
{
content + =
$"\t{rero.Emote} -> {(ctx.Guild.GetRole(rero.RoleId)?.Mention ?? " < missing role > ")}" ;
if ( rero . LevelReq > 0 )
content + = $" (lvl {rero.LevelReq}+)" ;
content + = '\n' ;
}
}
}
embed . WithDescription ( string . IsNullOrWhiteSpace ( content )
? "There are no reaction roles on this server"
: content ) ;
return embed ;
} )
. SendAsync ( ) ;
}
[Cmd]
[RequireContext(ContextType.Guild)]
[UserPerm(GuildPerm.ManageRoles)]
[BotPerm(GuildPerm.ManageRoles)]
public async Task ReRoRemove ( ulong messageId )
{
var succ = await _rero . RemoveReactionRoles ( ctx . Guild . Id , messageId ) ;
if ( succ )
await ctx . OkAsync ( ) ;
else
await ctx . ErrorAsync ( ) ;
}
[Cmd]
[RequireContext(ContextType.Guild)]
[UserPerm(GuildPerm.ManageRoles)]
[BotPerm(GuildPerm.ManageRoles)]
public async Task ReRoDeleteAll ( )
{
await _rero . RemoveAllReactionRoles ( ctx . Guild . Id ) ;
await ctx . OkAsync ( ) ;
}
[Cmd]
[RequireContext(ContextType.Guild)]
[UserPerm(GuildPerm.ManageRoles)]
[BotPerm(GuildPerm.ManageRoles)]
[Ratelimit(60)]
public async Task ReRoTransfer ( ulong fromMessageId , ulong toMessageId )
{
var msg = await ctx . Channel . GetMessageAsync ( toMessageId ) ;
if ( msg is null )
{
await ctx . ErrorAsync ( ) ;
return ;
}
var reactions = await _rero . TransferReactionRolesAsync ( ctx . Guild . Id , fromMessageId , toMessageId ) ;
if ( reactions . Count = = 0 )
{
await ctx . ErrorAsync ( ) ;
}
else
{
foreach ( var r in reactions )
{
await msg . AddReactionAsync ( r ) ;
}
}
}
}
}