mirror of
https://gitlab.com/Kwoth/nadekobot.git
synced 2025-09-10 17:28:27 -04:00
Added .doas command which executes the command as if you were the target user
This commit is contained in:
138
src/NadekoBot/Modules/Administration/Self/DoAsUserMessage.cs
Normal file
138
src/NadekoBot/Modules/Administration/Self/DoAsUserMessage.cs
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
using MessageType = Discord.MessageType;
|
||||||
|
|
||||||
|
namespace NadekoBot.Modules.Administration;
|
||||||
|
|
||||||
|
public sealed class DoAsUserMessage : IUserMessage
|
||||||
|
{
|
||||||
|
private readonly string _message;
|
||||||
|
private IUserMessage _msg;
|
||||||
|
private readonly IUser _user;
|
||||||
|
|
||||||
|
public DoAsUserMessage(SocketUserMessage msg, IUser user, string message)
|
||||||
|
{
|
||||||
|
_msg = msg;
|
||||||
|
_user = user;
|
||||||
|
_message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ulong Id => _msg.Id;
|
||||||
|
|
||||||
|
public DateTimeOffset CreatedAt => _msg.CreatedAt;
|
||||||
|
|
||||||
|
public Task DeleteAsync(RequestOptions options = null)
|
||||||
|
{
|
||||||
|
return _msg.DeleteAsync(options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task AddReactionAsync(IEmote emote, RequestOptions options = null)
|
||||||
|
{
|
||||||
|
return _msg.AddReactionAsync(emote, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task RemoveReactionAsync(IEmote emote, IUser user, RequestOptions options = null)
|
||||||
|
{
|
||||||
|
return _msg.RemoveReactionAsync(emote, user, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task RemoveReactionAsync(IEmote emote, ulong userId, RequestOptions options = null)
|
||||||
|
{
|
||||||
|
return _msg.RemoveReactionAsync(emote, userId, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task RemoveAllReactionsAsync(RequestOptions options = null)
|
||||||
|
{
|
||||||
|
return _msg.RemoveAllReactionsAsync(options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task RemoveAllReactionsForEmoteAsync(IEmote emote, RequestOptions options = null)
|
||||||
|
{
|
||||||
|
return _msg.RemoveAllReactionsForEmoteAsync(emote, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IAsyncEnumerable<IReadOnlyCollection<IUser>> GetReactionUsersAsync(IEmote emoji, int limit,
|
||||||
|
RequestOptions options = null)
|
||||||
|
{
|
||||||
|
return _msg.GetReactionUsersAsync(emoji, limit, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MessageType Type => _msg.Type;
|
||||||
|
|
||||||
|
public MessageSource Source => _msg.Source;
|
||||||
|
|
||||||
|
public bool IsTTS => _msg.IsTTS;
|
||||||
|
|
||||||
|
public bool IsPinned => _msg.IsPinned;
|
||||||
|
|
||||||
|
public bool IsSuppressed => _msg.IsSuppressed;
|
||||||
|
|
||||||
|
public bool MentionedEveryone => _msg.MentionedEveryone;
|
||||||
|
|
||||||
|
public string Content => _message;
|
||||||
|
|
||||||
|
public string CleanContent => _msg.CleanContent;
|
||||||
|
|
||||||
|
public DateTimeOffset Timestamp => _msg.Timestamp;
|
||||||
|
|
||||||
|
public DateTimeOffset? EditedTimestamp => _msg.EditedTimestamp;
|
||||||
|
|
||||||
|
public IMessageChannel Channel => _msg.Channel;
|
||||||
|
|
||||||
|
public IUser Author => _user;
|
||||||
|
|
||||||
|
public IReadOnlyCollection<IAttachment> Attachments => _msg.Attachments;
|
||||||
|
|
||||||
|
public IReadOnlyCollection<IEmbed> Embeds => _msg.Embeds;
|
||||||
|
|
||||||
|
public IReadOnlyCollection<ITag> Tags => _msg.Tags;
|
||||||
|
|
||||||
|
public IReadOnlyCollection<ulong> MentionedChannelIds => _msg.MentionedChannelIds;
|
||||||
|
|
||||||
|
public IReadOnlyCollection<ulong> MentionedRoleIds => _msg.MentionedRoleIds;
|
||||||
|
|
||||||
|
public IReadOnlyCollection<ulong> MentionedUserIds => _msg.MentionedUserIds;
|
||||||
|
|
||||||
|
public MessageActivity Activity => _msg.Activity;
|
||||||
|
|
||||||
|
public MessageApplication Application => _msg.Application;
|
||||||
|
|
||||||
|
public MessageReference Reference => _msg.Reference;
|
||||||
|
|
||||||
|
public IReadOnlyDictionary<IEmote, ReactionMetadata> Reactions => _msg.Reactions;
|
||||||
|
|
||||||
|
public IReadOnlyCollection<IMessageComponent> Components => _msg.Components;
|
||||||
|
|
||||||
|
public IReadOnlyCollection<IStickerItem> Stickers => _msg.Stickers;
|
||||||
|
|
||||||
|
public MessageFlags? Flags => _msg.Flags;
|
||||||
|
|
||||||
|
public IMessageInteraction Interaction => _msg.Interaction;
|
||||||
|
|
||||||
|
public Task ModifyAsync(Action<MessageProperties> func, RequestOptions options = null)
|
||||||
|
{
|
||||||
|
return _msg.ModifyAsync(func, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task PinAsync(RequestOptions options = null)
|
||||||
|
{
|
||||||
|
return _msg.PinAsync(options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task UnpinAsync(RequestOptions options = null)
|
||||||
|
{
|
||||||
|
return _msg.UnpinAsync(options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task CrosspostAsync(RequestOptions options = null)
|
||||||
|
{
|
||||||
|
return _msg.CrosspostAsync(options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Resolve(TagHandling userHandling = TagHandling.Name, TagHandling channelHandling = TagHandling.Name,
|
||||||
|
TagHandling roleHandling = TagHandling.Name,
|
||||||
|
TagHandling everyoneHandling = TagHandling.Ignore, TagHandling emojiHandling = TagHandling.Name)
|
||||||
|
{
|
||||||
|
return _msg.Resolve(userHandling, channelHandling, roleHandling, everyoneHandling, emojiHandling);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IUserMessage ReferencedMessage => _msg.ReferencedMessage;
|
||||||
|
}
|
@@ -35,6 +35,26 @@ public partial class Administration
|
|||||||
_medusaLoader = medusaLoader;
|
_medusaLoader = medusaLoader;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Cmd]
|
||||||
|
[OwnerOnly]
|
||||||
|
public async Task DoAs(IUser user, [Leftover] string message)
|
||||||
|
{
|
||||||
|
if (ctx.User is not IGuildUser { GuildPermissions.Administrator: true })
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (ctx.Guild is SocketGuild sg && ctx.Channel is ISocketMessageChannel ch
|
||||||
|
&& ctx.Message is SocketUserMessage msg)
|
||||||
|
{
|
||||||
|
var fakeMessage = new DoAsUserMessage(msg, user, message);
|
||||||
|
|
||||||
|
await _cmdHandler.TryRunCommand(sg, ch, fakeMessage);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await ReplyErrorLocalizedAsync(strs.error_occured);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Cmd]
|
[Cmd]
|
||||||
[RequireContext(ContextType.Guild)]
|
[RequireContext(ContextType.Guild)]
|
||||||
[UserPerm(GuildPerm.Administrator)]
|
[UserPerm(GuildPerm.Administrator)]
|
||||||
|
@@ -302,7 +302,7 @@ public class CommandHandler : INService, IReadyExecutor
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Task<(bool Success, string Error, CommandInfo Info)> ExecuteCommandAsync(
|
public Task<(bool Success, string Error, CommandInfo Info)> ExecuteCommandAsync(
|
||||||
CommandContext context,
|
ICommandContext context,
|
||||||
string input,
|
string input,
|
||||||
int argPos,
|
int argPos,
|
||||||
IServiceProvider serviceProvider,
|
IServiceProvider serviceProvider,
|
||||||
@@ -311,7 +311,7 @@ public class CommandHandler : INService, IReadyExecutor
|
|||||||
|
|
||||||
|
|
||||||
public async Task<(bool Success, string Error, CommandInfo Info)> ExecuteCommand(
|
public async Task<(bool Success, string Error, CommandInfo Info)> ExecuteCommand(
|
||||||
CommandContext context,
|
ICommandContext context,
|
||||||
string input,
|
string input,
|
||||||
IServiceProvider services,
|
IServiceProvider services,
|
||||||
MultiMatchHandling multiMatchHandling = MultiMatchHandling.Exception)
|
MultiMatchHandling multiMatchHandling = MultiMatchHandling.Exception)
|
||||||
|
@@ -1383,4 +1383,7 @@ patronmessage:
|
|||||||
eval:
|
eval:
|
||||||
- eval
|
- eval
|
||||||
autopublish:
|
autopublish:
|
||||||
- autopublish
|
- autopublish
|
||||||
|
doas:
|
||||||
|
- doas
|
||||||
|
- execas
|
@@ -2345,4 +2345,8 @@ threaddelete:
|
|||||||
autopublish:
|
autopublish:
|
||||||
desc: "Make the bot automatically publish all messages posted in the news channel this command was executed in."
|
desc: "Make the bot automatically publish all messages posted in the news channel this command was executed in."
|
||||||
args:
|
args:
|
||||||
- ""
|
- ""
|
||||||
|
doas:
|
||||||
|
desc: "Execute the command as if you were the target user. Requires bot ownership and server administrator permission."
|
||||||
|
args:
|
||||||
|
- "@Thief .give all @Admin"
|
||||||
|
Reference in New Issue
Block a user