diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9860f9d5..67a650ec 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,7 +3,8 @@
This is the rolling changelog for TShock for Terraria. Use past tense when adding new entries; sign your name off when you add or change something. This should primarily be things like user changes, not necessarily codebase changes unless it's really relevant or large.
## Upcoming Changes
-* Add Emoji event to GetDataHandler. This packet is received when a player tries to display an emote.
+* Add Emoji event to GetDataHandler. This packet is received when a player tries to display an emote.
+ * Adding EmojiHandler to handle an exploit. Adding `tshock.sendemoji` permission and checks. Added this permission to guest group by default.
## TShock 4.4.0 (Pre-release 10)
* Fix all rope coils. (@Olink)
diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs
index 584ad374..3cff37a1 100644
--- a/TShockAPI/DB/GroupManager.cs
+++ b/TShockAPI/DB/GroupManager.cs
@@ -65,7 +65,8 @@ namespace TShockAPI.DB
Permissions.canpartychat,
Permissions.cantalkinthird,
Permissions.canchat,
- Permissions.synclocalarea));
+ Permissions.synclocalarea,
+ Permissions.sendemoji));
AddDefaultGroup("default", "guest",
string.Join(",",
diff --git a/TShockAPI/Handlers/EmojiHandler.cs b/TShockAPI/Handlers/EmojiHandler.cs
new file mode 100644
index 00000000..39570d80
--- /dev/null
+++ b/TShockAPI/Handlers/EmojiHandler.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace TShockAPI.Handlers
+{
+ ///
+ /// Handles an exploit and checks for permissions.
+ ///
+ public class EmojiHandler
+ {
+ public void OnEmoji(object sender, GetDataHandlers.EmojiEventArgs args)
+ {
+ if (args.PlayerIndex != args.Player.Index)
+ {
+ TShock.Log.ConsoleError($"EmojiHandler: Packet is spoofing to be player ID {args.PlayerIndex}! - From [{args.Player.Index}]{args.Player.Name}");
+ args.Handled = true;
+ return;
+ }
+
+ if (!args.Player.HasPermission(Permissions.sendemoji))
+ {
+ args.Player.SendErrorMessage("You have no permission to send emotes!");
+ args.Handled = true;
+ return;
+ }
+ }
+ }
+}
diff --git a/TShockAPI/Permissions.cs b/TShockAPI/Permissions.cs
index baf21a73..4b196380 100644
--- a/TShockAPI/Permissions.cs
+++ b/TShockAPI/Permissions.cs
@@ -468,6 +468,9 @@ namespace TShockAPI
[Description("Player can resync themselves with server state.")]
public static readonly string synclocalarea = "tshock.synclocalarea";
+
+ [Description("Player can send emotes.")]
+ public static readonly string sendemoji = "tshock.sendemoji";
#endregion
///
/// Lists all commands associated with a given permission