diff --git a/Terracord/Discord.cs b/Terracord/Discord.cs
index ba52b83..103475f 100644
--- a/Terracord/Discord.cs
+++ b/Terracord/Discord.cs
@@ -21,6 +21,7 @@
using Discord;
using Discord.WebSocket;
using System;
+using System.Text;
using System.Threading.Tasks;
using TShockAPI;
@@ -166,14 +167,17 @@ private Task MessageReceived(SocketMessage message)
if(message.Author.Id == Client.CurrentUser.Id)
return Task.CompletedTask;
- // Check for a command
+ // Check for and handle commands
if(message.Content.StartsWith(Config.CommandPrefix.ToString()) && message.Content.Length > 1)
CommandHandler(message.Content);
+ // Check for mentions and convert them to friendly names if found
+ string messageContent = ConvertMentions(message);
+
// Relay Discord message to Terraria players
if(Config.LogChat)
- Util.Log($"<{message.Author.Username}@Discord> {message.Content}", Util.Severity.Info);
- TShock.Utils.Broadcast($"<{message.Author.Username}@Discord> {message.Content}", Config.BroadcastColor[0], Config.BroadcastColor[1], Config.BroadcastColor[2]);
+ Util.Log($"<{message.Author.Username}@Discord> {messageContent}", Util.Severity.Info);
+ TShock.Utils.Broadcast($"<{message.Author.Username}@Discord> {messageContent}", Config.BroadcastColor[0], Config.BroadcastColor[1], Config.BroadcastColor[2]);
}
catch(Exception e)
{
@@ -183,6 +187,23 @@ private Task MessageReceived(SocketMessage message)
return Task.CompletedTask;
}
+ ///
+ /// Sends a message to a Discord channel
+ ///
+ /// message to send to Discord channel
+ public void Send(string message)
+ {
+ try
+ {
+ // channel? checks if object is null prior to sending message
+ channel?.SendMessageAsync(message);
+ }
+ catch(Exception e)
+ {
+ Util.Log($"Unable to send Discord message: {e.Message}", Util.Severity.Error);
+ }
+ }
+
///
/// Handles Discord commands
///
@@ -218,26 +239,48 @@ private Task CommandHandler(string command)
}
if(command.Equals("uptime", StringComparison.OrdinalIgnoreCase))
- Send($"**__Uptime__**\n```\n{Util.Uptime()}\n```");
+ {
+ //Send($"**__Uptime__**\n```\n{Util.Uptime()}\n```");
+ EmbedBuilder embed = new EmbedBuilder();
+ embed.WithColor(Color.Blue)
+ .WithDescription(Util.Uptime())
+ .WithFooter(footer => footer.Text = $"Terracord {Terracord.version}")
+ .WithCurrentTimestamp()
+ .WithTitle("Uptime");
+ channel.SendMessageAsync("", false, embed.Build());
+ }
return Task.CompletedTask;
}
///
- /// Sends a message to a Discord channel
+ /// Converts channel, role, and user mentions to friendly names before being broadcasted to TShock players
///
- /// message to send to Discord channel
- public void Send(string message)
+ /// message received by Discord bot
+ /// modified message text
+ private string ConvertMentions(SocketMessage message)
{
- try
+ StringBuilder modifiedMessageText = new StringBuilder(message.Content);
+
+ if(message.MentionedChannels.Count > 0)
{
- // channel? checks if object is null prior to sending message
- channel?.SendMessageAsync(message);
+ foreach(var channel in message.MentionedChannels)
+ modifiedMessageText = modifiedMessageText.Replace($"<#{channel.Id}>", $"#{channel.Name}");
}
- catch(Exception e)
+
+ if(message.MentionedRoles.Count > 0)
{
- Util.Log($"Unable to send Discord message: {e.Message}", Util.Severity.Error);
+ foreach(var role in message.MentionedRoles)
+ modifiedMessageText = modifiedMessageText.Replace($"<@&{role.Id}>", $"@{role.Name}");
}
+
+ if(message.MentionedUsers.Count > 0)
+ {
+ foreach(var user in message.MentionedUsers)
+ modifiedMessageText = modifiedMessageText.Replace($"<@!{user.Id}>", $"@{user.Username}");
+ }
+
+ return modifiedMessageText.ToString();
}
}
}
diff --git a/Terracord/Terracord.cs b/Terracord/Terracord.cs
index a5d69a7..8660ba2 100644
--- a/Terracord/Terracord.cs
+++ b/Terracord/Terracord.cs
@@ -159,14 +159,17 @@ private void OnChat(ServerChatEventArgs args)
* 1. Check args.Text for regex match of a tag.
* 2. If 1 or more instances found, iterate through Discord server members to find potential username matches.
* 3. Replace @user tags in args.Text with user.Mention and send the message
- var guilds = botClient.Guilds;
+ var guilds = discord.Client.Guilds;
foreach(var guild in guilds)
{
- var members = guild.Users;
- foreach(var member in members)
+ foreach(var role in guild.Roles)
+ Console.WriteLine(role.Mention);
+ foreach(var channel in guild.TextChannels)
+ Console.WriteLine(channel.Mention);
+ foreach(var user in guild.Users)
{
- if("test".Equals(member.Username, StringComparison.OrdinalIgnoreCase))
- Console.WriteLine($"{member.Mention}");
+ if("test".Equals(user.Username, StringComparison.OrdinalIgnoreCase))
+ Console.WriteLine($"{user.Mention}");
}
}
*/