Hello, welcome to a new C# tutorial!.
So I was going through our discord earlier (which you should join if you haven’t, here is the link),
when I came across a spam message!.
So after deleting the spam a guy on our discord said, I wish discord had an AI feature to auto-delete spam messages.
So I decided to make a tutorial for it.
We will be building a discoed bot that will be able to detect when someone sends a link, send it to a security service that will check whether if the link is safe or not, and if so delete the message containing the link.
We will be using discord .net which is a C# warapper for discord API, we have lots to do so let’s get started.
Setting Up The Project
- First, create a new C# Console App.
- in the Solution Explorer, find the “Dependencies” element under your bot’s project
- Right-click on “Dependencies”, and select “Manage NuGet packages”
- In the “Browse” tab, search for
Discord.Net
- Install the
Discord.Net
package
Follow the steps in the Discord.Net documentation to create a new bot app and acquire a token.
https://docs.stillu.cc/guides/getting_started/first-bot.html
Go to IPQualityScore Create an account and acquire your private key.
Adding a Config File for our Keys
Create a new C# class and add your keys to it like so:
public static class EnvVariables { public static string discordBotToekn = "YOUR_DISCORD_TOKEN"; public static string ipScoreKey = "YOUR_IP_SCORE_KEY"; }
Creating JSON Response Classes
We need a couple of C# classes to hold the JSON response from IPQualityScore
public class DomainAge { public string human { get; set; } public int timestamp { get; set; } public DateTime iso { get; set; } }
public class Root { public string message { get; set; } public bool success { get; set; } public bool @unsafe { get; set; } public string domain { get; set; } public string server { get; set; } public string content_type { get; set; } public int status_code { get; set; } public int page_size { get; set; } public int domain_rank { get; set; } public bool dns_valid { get; set; } public bool parking { get; set; } public bool spamming { get; set; } public bool malware { get; set; } public bool phishing { get; set; } public bool suspicious { get; set; } public bool adult { get; set; } public int risk_score { get; set; } public string category { get; set; } public DomainAge domain_age { get; set; } public string request_id { get; set; } }
Programming our Bot
First, we need to create a config object for our discord socket client, and set the message cache size to 200, so that our bot can cache discord messages.
Then we will log in and start our bot. Also, subscribe to the MessageRecieved event.
First, we need to prepare our URL and our post request values, after that make the post request and parse the JSON response and check the URL score, if the URL is not safe then we will delete the message.
using System; using Discord; using Discord.WebSocket; using System.Threading.Tasks; using System.Text.RegularExpressions; using System.Net.Http; using System.Collections.Generic; using Newtonsoft.Json; namespace DicordAntiSpamBot { class Program { private static DiscordSocketClient client; static async Task Main(string[] args) { //crete a new config object and set the message cache size to 200 var config = new DiscordSocketConfig { MessageCacheSize = 200 }; //init our discord client with our config obj client = new DiscordSocketClient(config); //subscribe to the log event client.Log += Log; //login using our token await client.LoginAsync(TokenType.Bot, EnvVariables.discordBotToekn); //start the bot await client.StartAsync(); //subscribe to the MessageReceived event client.MessageReceived += MessageReceived; //keep the app running await Task.Delay(-1); } private static async Task MessageReceived(SocketMessage arg) { //log our message into the console Console.WriteLine($"{arg.Content}"); //if the message received was sent by the bot then ignore it if (arg.Author.Id == client.CurrentUser.Id) return; //just a test ping command if (arg.Content == "Ping") { await arg.Channel.SendMessageAsync("Pong"); return; } //create a new regex that will search for a URL pattern in our messages var myRegex = new Regex(@"\b(?:https?://|www\.)\S+\b", RegexOptions.Compiled | RegexOptions.IgnoreCase); //create a new http client to make a post request HttpClient httpClient = new HttpClient(); //prepare the post request values var postReqvalues = new Dictionary<string, string> { {"stricktness","0" }, {"fast","true" } }; // create a URL encoded content from our values var content = new FormUrlEncodedContent(postReqvalues); //for each URL we found in our message foreach (Match match in myRegex.Matches(arg.Content)) { //fix the string format, since we are sending it as an embeded variable in our URL string url = match.Value.Replace(":","%3A").Replace("/","%2F"); //make a post request to IPQualityScore HttpResponseMessage response = await httpClient.PostAsync("https://ipqualityscore.com/api/json/url/"+EnvVariables.ipScoreKey+"/" + url, content); //read the response as a string string responseString = await response.Content.ReadAsStringAsync(); //parse the response into a C# object Root parsedResponse = JsonConvert.DeserializeObject<Root>(responseString); //check if the link is safe if (parsedResponse.@unsafe == true||parsedResponse.suspicious||parsedResponse.risk_score<50) { //if it's not then : //shame the sender await arg.Channel.SendMessageAsync($"Spam Found !{arg.Author.Username} bad boi!"); //delete the message await arg.DeleteAsync(); //no need to go through the rest of the urls if one of them is unsafe break; } //log the response Console.WriteLine(responseString); } } private static Task Log(LogMessage arg) { Console.WriteLine(arg.ToString()); return Task.CompletedTask; } } }