mirror of
				https://gitlab.com/Kwoth/nadekobot.git
				synced 2025-11-04 00:34:26 -05: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;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [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]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        [UserPerm(GuildPerm.Administrator)]
 | 
			
		||||
 
 | 
			
		||||
@@ -302,7 +302,7 @@ public class CommandHandler : INService, IReadyExecutor
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Task<(bool Success, string Error, CommandInfo Info)> ExecuteCommandAsync(
 | 
			
		||||
        CommandContext context,
 | 
			
		||||
        ICommandContext context,
 | 
			
		||||
        string input,
 | 
			
		||||
        int argPos,
 | 
			
		||||
        IServiceProvider serviceProvider,
 | 
			
		||||
@@ -311,7 +311,7 @@ public class CommandHandler : INService, IReadyExecutor
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public async Task<(bool Success, string Error, CommandInfo Info)> ExecuteCommand(
 | 
			
		||||
        CommandContext context,
 | 
			
		||||
        ICommandContext context,
 | 
			
		||||
        string input,
 | 
			
		||||
        IServiceProvider services,
 | 
			
		||||
        MultiMatchHandling multiMatchHandling = MultiMatchHandling.Exception)
 | 
			
		||||
 
 | 
			
		||||
@@ -1383,4 +1383,7 @@ patronmessage:
 | 
			
		||||
eval:
 | 
			
		||||
  - eval
 | 
			
		||||
autopublish:
 | 
			
		||||
  - autopublish
 | 
			
		||||
  - autopublish
 | 
			
		||||
doas:
 | 
			
		||||
  - doas
 | 
			
		||||
  - execas 
 | 
			
		||||
@@ -2345,4 +2345,8 @@ threaddelete:
 | 
			
		||||
autopublish:
 | 
			
		||||
  desc: "Make the bot automatically publish all messages posted in the news channel this command was executed in."
 | 
			
		||||
  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