Files
abysmal-isle/Scripts/SubSystem/DiscordBot/DiscordBot.cs
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

227 lines
4.2 KiB
C#

#region Header
// Vorspire _,-'/-'/ DiscordBot.cs
// . __,-; ,'( '/
// \. `-.__`-._`:_,-._ _ , . ``
// `:-._,------' ` _,`--` -: `_ , ` ,' :
// `---..__,,--' (C) 2017 ` -'. -'
// # Vita-Nex [http://core.vita-nex.com] #
// {o)xxx|===============- # -===============|xxx(o}
// # The MIT License (MIT) #
#endregion
#region References
using System;
using System.Linq;
using Server;
using Server.Misc;
using VitaNex.Collections;
using VitaNex.IO;
using VitaNex.Modules.AutoPvP;
using VitaNex.Text;
using VitaNex.Web;
#endregion
namespace VitaNex.Modules.Discord
{
public static partial class DiscordBot
{
public const AccessLevel Access = AccessLevel.Administrator;
private static readonly string[] _SaveMessages;
private static string _LastMessage;
private static readonly DictionaryPool<string, object> _Pool;
public static DiscordBotOptions CMOptions { get; private set; }
/*
private static void OnWorldBroadcast(WorldBroadcastEventArgs e)
{
if (CMOptions.HandleBroadcast)
{
SendMessage(e.Text);
}
}
*/
private static void OnServerShutdown(ShutdownEventArgs e)
{
if (CMOptions.HandleStatus)
{
SendMessage("Status: Offline");
}
}
private static void OnServerCrashed(CrashedEventArgs e)
{
if (CMOptions.HandleStatus)
{
SendMessage("Status: Offline (Back Soon!)");
}
}
private static void OnServerStarted()
{
if (CMOptions.HandleStatus)
{
SendMessage("Status: Online");
}
}
private static void OnNotifyBroadcast(string message)
{
if (CMOptions.HandleNotify)
{
SendMessage(message);
}
}
private static void OnBattleWorldBroadcast(PvPBattle b, string text)
{
if (CMOptions.HandleBattles)
{
SendMessage(text);
}
}
public static void SendMessage(string message)
{
SendMessage(message, true);
}
public static void SendMessage(string message, bool filtered)
{
if (!CMOptions.ModuleEnabled || String.IsNullOrWhiteSpace(message))
{
return;
}
var uri = GetWebhookUri();
if (uri.Contains("NULL"))
{
return;
}
message = message.StripHtmlBreaks(true).StripHtml(false);
if (filtered)
{
if (CMOptions.FilterSaves && _SaveMessages.Any(o => Insensitive.Contains(message, o)))
{
return;
}
if (CMOptions.FilterRepeat && _LastMessage == message)
{
return;
}
}
_LastMessage = message;
var d = _Pool.Acquire();
d["content"] = message;
d["username"] = ServerList.ServerName;
d["file"] = null;
d["embeds"] = null;
WebAPI.BeginRequest(
uri,
d,
(req, o) =>
{
req.Method = "POST";
req.ContentType = FileMime.Lookup("json");
req.SetContent(Json.Encode(o));
_Pool.Free(o);
},
null);
}
public static string GetWebhookUri()
{
return GetWebhookUri(CMOptions.ModuleDebug);
}
public static string GetWebhookUri(bool debug)
{
return GetWebhook(debug).ToString();
}
public static Uri GetWebhook(bool debug)
{
var id = debug ? CMOptions.WebhookDebugID : CMOptions.WebhookID;
var key = debug ? CMOptions.WebhookDebugKey : CMOptions.WebhookKey;
if (String.IsNullOrWhiteSpace(id))
{
id = "NULL";
}
if (String.IsNullOrWhiteSpace(key))
{
key = "NULL";
}
return new Uri("https://discordapp.com/api/webhooks/" + id + "/" + key);
}
public static bool SetWebhook(string uri, bool debug)
{
try
{
return SetWebhook(new Uri(uri), debug);
}
catch
{
return false;
}
}
public static bool SetWebhook(Uri u, bool debug)
{
try
{
var s = u.ToString();
var i = s.IndexOf("discordapp.com/api/webhooks/", StringComparison.OrdinalIgnoreCase);
if (i < 0 || i >= s.Length - 28)
{
return false;
}
s = s.Substring(i + 28);
i = s.IndexOf('/');
if (i <= 0 || i >= s.Length - 1)
{
return false;
}
if (debug)
{
CMOptions.WebhookDebugID = s.Substring(0, i);
CMOptions.WebhookDebugKey = s.Substring(i + 1);
}
else
{
CMOptions.WebhookID = s.Substring(0, i);
CMOptions.WebhookKey = s.Substring(i + 1);
}
return true;
}
catch
{
return false;
}
}
}
}