@@ -12,7 +12,7 @@ namespace SkyBot.Commands
|
||||
public string Name => "cat";
|
||||
public string[] Aliases => [];
|
||||
public string Description => "Posts a random cat picture.";
|
||||
public string Section => "Fun";
|
||||
public string Section => "Chill";
|
||||
public string Usage => "cat";
|
||||
|
||||
private static readonly HttpClient _http = new();
|
||||
123
SkyBot/Commands/Chill/Hug.cs
Normal file
123
SkyBot/Commands/Chill/Hug.cs
Normal file
@@ -0,0 +1,123 @@
|
||||
using System.Collections.Concurrent;
|
||||
using System.Text.Json;
|
||||
using SkyBot.Helpers;
|
||||
using SkyBot.Models;
|
||||
using Valour.Sdk.Models;
|
||||
using Valour.Shared.Models;
|
||||
|
||||
namespace SkyBot.Commands
|
||||
{
|
||||
public class Hug : ICommand
|
||||
{
|
||||
public string Name => "hug";
|
||||
public string[] Aliases => [];
|
||||
public string Description => "Send a hug with a random gif.";
|
||||
public string Section => "Chill";
|
||||
public string Usage => "hug [@user]";
|
||||
|
||||
private static readonly HttpClient _http = new()
|
||||
{
|
||||
DefaultRequestHeaders = { { "User-Agent", "SkyBot/1.0" } }
|
||||
};
|
||||
|
||||
public async Task Execute(CommandContext ctx)
|
||||
{
|
||||
ConcurrentDictionary<long, Channel> channelCache = ctx.ChannelCache;
|
||||
long channelId = ctx.ChannelId;
|
||||
|
||||
if (!channelCache.TryGetValue(channelId, out var channel)) return;
|
||||
|
||||
await channel.SendIsTyping();
|
||||
|
||||
// Fetch a random hug gif from nekos.best
|
||||
string json;
|
||||
try
|
||||
{
|
||||
json = await _http.GetStringAsync("https://nekos.best/api/v2/hug");
|
||||
}
|
||||
catch
|
||||
{
|
||||
await MessageHelper.ReplyAsync(ctx, channel, "Could not fetch a hug gif. Try again later.");
|
||||
return;
|
||||
}
|
||||
|
||||
using var doc = JsonDocument.Parse(json);
|
||||
var results = doc.RootElement.GetProperty("results");
|
||||
string gifUrl = results[0].GetProperty("url").GetString()!;
|
||||
|
||||
// Download the gif bytes
|
||||
byte[] gifBytes;
|
||||
try
|
||||
{
|
||||
gifBytes = await _http.GetByteArrayAsync(gifUrl);
|
||||
}
|
||||
catch
|
||||
{
|
||||
await MessageHelper.ReplyAsync(ctx, channel, "Could not download the hug gif. Try again later.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Read GIF dimensions from header (bytes 6-9, little-endian)
|
||||
int width = 0, height = 0;
|
||||
if (gifBytes.Length >= 10)
|
||||
{
|
||||
width = gifBytes[6] | (gifBytes[7] << 8);
|
||||
height = gifBytes[8] | (gifBytes[9] << 8);
|
||||
}
|
||||
|
||||
// Upload to Valour CDN
|
||||
string cdnUrl;
|
||||
try
|
||||
{
|
||||
using var form = new MultipartFormDataContent();
|
||||
using var fileContent = new ByteArrayContent(gifBytes);
|
||||
fileContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/gif");
|
||||
form.Add(fileContent, "file", "hug.gif");
|
||||
|
||||
var uploadResult = await ctx.Planet.Node.PostMultipartDataWithResponse<string>("upload/image", form);
|
||||
if (!uploadResult.Success)
|
||||
{
|
||||
await MessageHelper.ReplyAsync(ctx, channel, "Could not upload the hug gif. Try again later.");
|
||||
return;
|
||||
}
|
||||
cdnUrl = uploadResult.Data!;
|
||||
}
|
||||
catch
|
||||
{
|
||||
await MessageHelper.ReplyAsync(ctx, channel, "Could not upload the hug gif. Try again later.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Resolve the hug target: replied-to message author > args > nobody
|
||||
string? target = null;
|
||||
if (ctx.Message.ReplyToId is not null)
|
||||
{
|
||||
var replied = await ctx.Message.FetchReplyMessageAsync();
|
||||
if (replied is not null)
|
||||
{
|
||||
var author = await replied.FetchAuthorAsync();
|
||||
if (author is not null)
|
||||
target = author.Name;
|
||||
}
|
||||
}
|
||||
if (target is null && ctx.Args.Length > 0)
|
||||
target = string.Join(" ", ctx.Args);
|
||||
|
||||
string sender = ctx.Member.Nickname ?? ctx.Member.User?.Name ?? "Unknown";
|
||||
string text = target is not null
|
||||
? $"{sender} hugs {target}! 🤗"
|
||||
: $"{sender} wants a hug! 🤗";
|
||||
|
||||
var attachment = new MessageAttachment(MessageAttachmentType.Image)
|
||||
{
|
||||
Location = cdnUrl,
|
||||
MimeType = "image/gif",
|
||||
FileName = "hug.gif",
|
||||
Width = width,
|
||||
Height = height
|
||||
};
|
||||
|
||||
await channel.SendMessageAsync(text, attachments: [attachment]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,7 @@ namespace SkyBot.Commands
|
||||
public class GetBans : ICommand
|
||||
{
|
||||
public string Name => "bans";
|
||||
public string[] Aliases => [""];
|
||||
public string[] Aliases => [];
|
||||
public string Description => "Lists all bans in the planet.";
|
||||
public string Section => "Mod";
|
||||
public string Usage => "bans [page]";
|
||||
|
||||
Reference in New Issue
Block a user