Guest User

Untitled

a guest
Mar 5th, 2026
101
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 257.54 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Text;
  7. using Newtonsoft.Json;
  8. using Newtonsoft.Json.Converters;
  9. using Oxide.Core.Plugins;
  10. using UnityEngine;
  11. using Facepunch;
  12. using Oxide.Core.Libraries.Covalence;
  13. using Oxide.Ext.Discord.Builders;
  14. using Oxide.Ext.Discord.Clients;
  15. using Oxide.Ext.Discord.Connections;
  16. using Oxide.Ext.Discord.Constants;
  17. using Oxide.Ext.Discord.Entities;
  18. using Oxide.Ext.Discord.Interfaces;
  19. using Oxide.Ext.Discord.Logging;
  20.  
  21.  
  22. namespace Oxide.Plugins
  23. {
  24. [Info("Rustcord", "Kirollos & OuTSMoKE", "3.4.2")]
  25. [Description("Complete game server monitoring through discord.")]
  26. internal class Rustcord : RustPlugin, IDiscordPlugin
  27. {
  28. [PluginReference] Plugin PrivateMessages, BetterChatMute, Clans, AdminChat, DiscordAuth, AdminHammer, AdminRadar, Kits, Vanish, RaidableBases, DangerousTreasures, NoGiveNotices, Give, AirEvent, HarborEvent, JunkyardEvent, PowerPlantEvent;
  29. public DiscordClient Client { get; set; }
  30.  
  31. #region Back End Shit
  32.  
  33. private Settings _settings;
  34.  
  35. private int? _channelCount;
  36.  
  37. private Snowflake _botId;
  38.  
  39. private UpdatePresenceCommand DiscordPresence = new UpdatePresenceCommand
  40. {
  41. Activities = new List<DiscordActivity>
  42. {
  43. new DiscordActivity
  44. {
  45. Type = ActivityType.Game,
  46. Name = "Rustcord Initializing..."
  47. }
  48. }
  49. };
  50.  
  51. private Timer StatusTimer = null;
  52.  
  53. private object FindUserByID(DiscordUser user)
  54. {
  55. throw new NotImplementedException();
  56. }
  57.  
  58. private static string FormatTime(TimeSpan time)
  59. {
  60. var values = new List<string>();
  61.  
  62. if (time.Days != 0)
  63. values.Add($"{time.Days} day(s)");
  64.  
  65. if (time.Hours != 0)
  66. values.Add($"{time.Hours} hour(s)");
  67.  
  68. if (time.Minutes != 0)
  69. values.Add($"{time.Minutes} minute(s)");
  70.  
  71. if (time.Seconds != 0)
  72. values.Add($"{time.Seconds} second(s)");
  73.  
  74. return values.ToSentence();
  75. }
  76.  
  77. private string GetPlayerFormattedField(IPlayer player)
  78. {
  79. return $"{player.Name} ([{player.Id}](https://steamcommunity.com/profiles/{player.Id}))";
  80. }
  81.  
  82. private string GetFormattedSteamID(string id)
  83. {
  84. return $"[{id}](https://steamcommunity.com/profiles/{id})";
  85. }
  86.  
  87. private string FindGridPosition(Vector3 position) => MapHelper.GridToString(MapHelper.PositionToGrid(position));
  88.  
  89. enum CacheType
  90. {
  91. OnPlayerChat = 0,
  92. OnPlayerConnected = 1,
  93. OnPlayerDisconnected = 2,
  94. OnPlayerJoin = 3
  95. }
  96.  
  97. Dictionary<CacheType, Dictionary<BasePlayer, Dictionary<string, string>>> cache = new Dictionary<CacheType, Dictionary<BasePlayer, Dictionary<string, string>>>();
  98. private string rbdiff;
  99.  
  100. Dictionary<string, string> GetPlayerCache(BasePlayer player, string message, CacheType type)
  101. {
  102. switch (type)
  103. {
  104. case CacheType.OnPlayerChat:
  105. {
  106. Dictionary<string, string> dict;
  107. if (!cache[CacheType.OnPlayerChat].TryGetValue(player, out dict))
  108. {
  109. cache[CacheType.OnPlayerChat].Add(player, dict = new Dictionary<string, string>
  110. {
  111. ["playername"] = player.displayName,
  112. ["message"] = message,
  113. ["playersteamid"] = player.UserIDString,
  114. ["time"] = DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")
  115. });
  116. }
  117.  
  118. dict["playername"] = player.displayName;
  119. dict["message"] = message;
  120. dict["playersteamid"] = player.UserIDString;
  121. dict["time"] = DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt");
  122. return dict;
  123. }
  124. case CacheType.OnPlayerConnected:
  125. {
  126. Dictionary<string, string> dict;
  127. if (!cache[CacheType.OnPlayerConnected].TryGetValue(player, out dict))
  128. {
  129. cache[CacheType.OnPlayerConnected].Add(player, dict = new Dictionary<string, string>
  130. {
  131. ["playername"] = player.displayName,
  132. ["playerip"] = message.Substring(0, message.IndexOf(":")),
  133. ["playersteamid"] = player.UserIDString,
  134. ["time"] = DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")
  135. });
  136. }
  137.  
  138. dict["playername"] = player.displayName;
  139. dict["playerip"] = message.Substring(0, message.IndexOf(":"));
  140. dict["playersteamid"] = player.UserIDString;
  141. dict["time"] = DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt");
  142. return dict;
  143. }
  144. case CacheType.OnPlayerJoin:
  145. {
  146. Dictionary<string, string> dict;
  147. if (!cache[CacheType.OnPlayerJoin].TryGetValue(player, out dict))
  148. {
  149. cache[CacheType.OnPlayerDisconnected].Add(player, dict = new Dictionary<string, string>
  150. {
  151. ["playername"] = player.displayName,
  152. ["time"] = DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")
  153. });
  154. }
  155.  
  156. dict["playername"] = player.displayName;
  157. dict["time"] = DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt");
  158. return dict;
  159. }
  160. case CacheType.OnPlayerDisconnected:
  161. default:
  162. {
  163. Dictionary<string, string> dict;
  164. if (!cache[CacheType.OnPlayerDisconnected].TryGetValue(player, out dict))
  165. {
  166. cache[CacheType.OnPlayerDisconnected].Add(player, dict = new Dictionary<string, string>
  167. {
  168. ["playername"] = player.displayName,
  169. ["reason"] = message,
  170. ["time"] = DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")
  171. });
  172. }
  173.  
  174. dict["playername"] = player.displayName;
  175. dict["reason"] = message;
  176. dict["time"] = DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt");
  177. return dict;
  178. }
  179. }
  180. }
  181.  
  182. private void OnDiscordClientCreated()
  183. {
  184. if (string.IsNullOrEmpty(_settings.General.Apikey) || _settings.General.Apikey == null || _settings.General.Apikey == "BotToken")
  185. {
  186. PrintError("API key is empty or invalid!");
  187. return;
  188. }
  189.  
  190. bool flag = true;
  191. try
  192. {
  193. BotConnection settings = new BotConnection
  194. {
  195. ApiToken = _settings.General.Apikey,
  196. Intents = GatewayIntents.Guilds | GatewayIntents.GuildMembers | GatewayIntents.GuildMessages | GatewayIntents.DirectMessages | GatewayIntents.MessageContent,
  197. LogLevel = _settings.General.ExtensionDebugging
  198. };
  199. Client.Connect(settings);
  200. }
  201. catch (Exception e)
  202. {
  203. flag = false;
  204. PrintError($"Rustcord failed to create client! Exception message: {e}");
  205. }
  206.  
  207. if (flag)
  208. {
  209. cmd.AddChatCommand(_settings.General.ReportCommand, this, "cmdReport");
  210. cmd.AddChatCommand("bug", this, "cmdBug");
  211. SubscribeHooks();
  212. }
  213.  
  214. if (_settings.GameLog.EnableCustomLogging)
  215. UnityEngine.Application.logMessageReceived += ConsoleLog;
  216. }
  217.  
  218. private void Reload()
  219. {
  220. rust.RunServerCommand("oxide.reload Rustcord");
  221. }
  222.  
  223. void OnDiscordGatewayReady(GatewayReadyEvent rdy)
  224. {
  225. _botId = rdy.User.Id;
  226. SubscribeHooks();
  227. _channelCount = _settings?.Channels.Count;
  228. if (_settings.General.EnableBotStatus)
  229. {
  230. NextFrame(() =>
  231. {
  232. if (StatusTimer != null && !StatusTimer.Destroyed)
  233. {
  234. StatusTimer.Destroy();
  235. }
  236. StatusTimer = timer.Every(6f, () =>
  237. {
  238. var text = new Dictionary<string, string>
  239. {
  240. ["playercount"] = Convert.ToString(BasePlayer.activePlayerList.Count),
  241. ["maxplayers"] = Convert.ToString(ConVar.Server.maxplayers),
  242. ["sleepercount"] = Convert.ToString(BasePlayer.sleepingPlayerList.Count)
  243. };
  244. var msg = Translate("Discord_Status", text);
  245. DiscordPresence.Activities[0].Name = string.IsNullOrEmpty(msg) ? "Rustcord initializing...." : msg;
  246. Client.UpdateStatus(DiscordPresence);
  247. });
  248. });
  249. }
  250. }
  251.  
  252. void OnDiscordGuildCreated(DiscordGuild newguild)
  253. {
  254.  
  255. for (int i = 0; i < _channelCount; i++)
  256. {
  257. if (_settings.Channels[i].perms.Contains("msg_plugininit"))
  258. {
  259. GetChannel(Client, _settings.Channels[i].Channelid, c => {
  260. c.CreateMessage(Client, "Rustcord Initialized!");
  261. }, newguild.Id);
  262. }
  263. }
  264. }
  265.  
  266. private void Unload()
  267. {
  268. if (StatusTimer != null && !StatusTimer.Destroyed)
  269. {
  270. StatusTimer.Destroy();
  271. }
  272. if (_settings.GameLog.EnableCustomLogging)
  273. UnityEngine.Application.logMessageReceived -= ConsoleLog;
  274. }
  275.  
  276. [HookMethod(DiscordExtHooks.OnDiscordGuildMessageCreated)]
  277. private void OnDiscordGuildMessageCreated(DiscordMessage message)
  278. {
  279. //Puts($"{nameof(OnDiscordGuildMessageCreated)} New Message: {message.Author.FullUserName}: {message.Content}.");
  280. if ((message.Content?.Length ?? 0) == 0)
  281. {
  282. //Puts($"{nameof(OnDiscordGuildMessageCreated)} Skipping Message {message.Author.FullUserName}: {message.Content}. Content Length is 0");
  283. return;
  284. }
  285.  
  286. Settings.Channel channelidx = FindChannelById(message.ChannelId);
  287. if (channelidx == null)
  288. {
  289. //Puts($"{nameof(OnDiscordGuildMessageCreated)} Skipping Message {message.Author.FullUserName}: {message.Content}. Channel Not Found");
  290. return;
  291. }
  292.  
  293. if (message.Author.Id == _botId)
  294. {
  295. return;
  296. }
  297.  
  298. if (message.Content[0] == _settings.DiscordSide.Commandprefix[0])
  299. {
  300. if (!channelidx.perms.Contains("cmd_allow"))
  301. return;
  302. string cmd;
  303. string msg;
  304. try
  305. {
  306. cmd = message.Content.Split(' ')[0].ToLower();
  307. if (string.IsNullOrEmpty(cmd.Trim()))
  308. cmd = message.Content.Trim().ToLower();
  309. }
  310. catch
  311. {
  312. cmd = message.Content.Trim().ToLower();
  313. }
  314.  
  315. cmd = cmd.Remove(0, 1);
  316.  
  317. msg = message.Content.Remove(0, 1 + cmd.Length).Trim();
  318. cmd = cmd.Trim();
  319. cmd = cmd.ToLower();
  320.  
  321. if (!channelidx.perms.Contains("cmd_" + cmd))
  322. return;
  323. if (!_settings.Commandroles.ContainsKey(cmd))
  324. {
  325. DiscordToGameCmd(cmd, msg, message.Author, message.ChannelId);
  326. return;
  327. }
  328. var roles = _settings.Commandroles[cmd];
  329. if (roles.Count == 0)
  330. {
  331. DiscordToGameCmd(cmd, msg, message.Author, message.ChannelId);
  332. return;
  333. }
  334.  
  335. foreach (var roleid in message.Member.Roles)
  336. {
  337. var rolename = GetRoleNameById(roleid);
  338. if (roles.Contains(rolename))
  339. {
  340. DiscordToGameCmd(cmd, msg, message.Author, message.ChannelId);
  341. break;
  342. }
  343. }
  344. }
  345. else
  346. {
  347. var chattag = "[discord.gg/rusthub]";
  348. var chattagcolor = _settings.DiscordSide.GameChatTagColor;
  349. var chatnamecolor = _settings.DiscordSide.GameChatNameColor;
  350. var chattextcolor = _settings.DiscordSide.GameChatTextColor;
  351. if (!channelidx.perms.Contains("msg_chat")) return;
  352. string nickname = message.Member?.Nickname ?? "";
  353. if (nickname.Length == 0)
  354. nickname = message.Author.DisplayName;
  355. //PrintToChat("<color=" + chattagcolor + ">" + chattag + "</color> " + "<color=" + chatnamecolor + ">" + nickname + ":</color> " + "<color=" + chattextcolor + ">" + message.content + "</color>");
  356. string text = $"<color={chattagcolor}>{chattag}</color> <color=#eb6a00>{nickname}:</color> <color={chattextcolor}>{message.Content}</color>";
  357. foreach (var player in BasePlayer.activePlayerList) Player.Message(player, text, 76561199532664659);
  358. Puts("[DISCORD] " + nickname + ": " + message.Content);
  359. }
  360. }
  361.  
  362. private string Translate(string msg, Dictionary<string, string> parameters = null)
  363. {
  364. if (string.IsNullOrEmpty(msg))
  365. return string.Empty;
  366.  
  367. msg = lang.GetMessage(msg, this);
  368.  
  369. if (parameters != null)
  370. {
  371. foreach (var lekey in parameters)
  372. {
  373. if (msg.Contains("{" + lekey.Key + "}"))
  374. msg = msg.Replace("{" + lekey.Key + "}", lekey.Value);
  375. }
  376. }
  377.  
  378. return msg;
  379. }
  380.  
  381.  
  382. private Settings.Channel FindChannelById(Snowflake id)
  383. {
  384. for (int i = 0; i < _channelCount; i++)
  385. {
  386. if (_settings.Channels[i].Channelid == id)
  387. return _settings.Channels[i];
  388. }
  389.  
  390. return null;
  391. }
  392.  
  393. private void GetChannel(DiscordClient c, Snowflake chan_id, Action<DiscordChannel> cb, Snowflake guildid = default(Snowflake))
  394. {
  395. //Guild g = guildid == null ? c.DiscordServers.FirstOrDefault(x => x.channels.FirstOrDefault(y => y.id == chan_id) != null) : c.GetGuild(guildid);
  396. DiscordGuild g = null;
  397. DiscordChannel foundchan = null;
  398. if (guildid.IsValid())
  399. g = c.Bot.GetGuild(guildid);
  400. else
  401. foreach (var G in c.Bot.Servers.Values)
  402. {
  403. foundchan = G.Channels[chan_id];
  404. if (foundchan != null)
  405. {
  406. g = G;
  407. break;
  408. }
  409. }
  410. if (g == null)
  411. {
  412. PrintWarning($"Rustcord failed to fetch channel! (chan_id={chan_id}). Guild is invalid.");
  413. return;
  414. }
  415. if (g.Unavailable ?? false == true)
  416. {
  417. PrintWarning($"Rustcord failed to fetch channel! (chan_id={chan_id}). Guild is possibly invalid or not available yet.");
  418. return;
  419. }
  420. //Channel foundchan = g?.channels?.FirstOrDefault(z => z.id == chan_id);
  421. if (foundchan == null)
  422. {
  423. if (guildid.IsValid()) return; // Ignore printing error
  424. PrintWarning($"Rustcord failed to fetch channel! (chan_id={chan_id}).");
  425. return;
  426. }
  427. if (foundchan.Id != chan_id) return;
  428. cb?.Invoke(foundchan);
  429. }
  430.  
  431. private string GetRoleNameById(Snowflake id)
  432. {
  433. //var role = _client.DiscordServers.FirstOrDefault(x => x.roles.FirstOrDefault(y => y.id == id) != null)?.roles.FirstOrDefault(z => z.id == id);
  434. //return role?.name ?? "";
  435. foreach (var r in Client.Bot.Servers.Values)
  436. {
  437. var role = r.Roles[id];
  438. if (role != null)
  439. {
  440. return role.Name;
  441. }
  442. }
  443. return string.Empty;
  444. }
  445.  
  446. private IPlayer FindPlayer(string nameorId)
  447. {
  448. foreach (var player in covalence.Players.Connected)
  449. {
  450. if (player.Id == nameorId)
  451. return player;
  452.  
  453. if (player.Name == nameorId)
  454. return player;
  455. }
  456.  
  457. return null;
  458. }
  459.  
  460. private DiscordUser FindUserByID(Snowflake id)
  461. {
  462. foreach (DiscordGuild guild in Client.Bot.Servers.Values)
  463. {
  464. var member = guild.Members[id];
  465. if (member != null)
  466. {
  467. return member.User;
  468. }
  469. }
  470.  
  471. return null;
  472. }
  473.  
  474. private BasePlayer FindPlayerByID(string Id)
  475. {
  476. foreach (var player in BasePlayer.activePlayerList)
  477. {
  478. if (player.UserIDString == Id)
  479. return player;
  480. }
  481.  
  482. return null;
  483. }
  484.  
  485. private IPlayer GetPlayer(string id)
  486. {
  487. return covalence.Players.FindPlayerById(id);
  488. }
  489.  
  490. private IPlayer GetPlayer(ulong id)
  491. {
  492. return GetPlayer(id.ToString());
  493. }
  494.  
  495. #endregion
  496.  
  497. #region Config Layout
  498. private class Settings
  499. {
  500. [JsonProperty(PropertyName = "General Settings")]
  501. public GeneralSettings General { get; set; }
  502.  
  503. [JsonProperty(PropertyName = "Discord to Game Settings")]
  504. public DiscordSideSettings DiscordSide { get; set; }
  505.  
  506. [JsonProperty(PropertyName = "Rust Logging Settings")]
  507. public GameLogSettings GameLog { get; set; }
  508.  
  509. [JsonProperty(PropertyName = "Plugin Logging Settings")]
  510. public PluginLogSettings PluginLog { get; set; }
  511.  
  512. [JsonProperty(PropertyName = "Premium Plugin Logging Settings")]
  513. public PremiumPluginLogSettings PremiumPluginLog { get; set; }
  514.  
  515. [JsonProperty(PropertyName = "Discord Output Formatting")]
  516. public OutputSettings OutputFormat { get; set; }
  517.  
  518. [JsonProperty(PropertyName = "Logging Exclusions")]
  519. public ExcludedSettings Excluded { get; set; }
  520.  
  521. [JsonProperty(PropertyName = "Filter Settings")]
  522. public FilterSettings Filters { get; set; }
  523.  
  524. [JsonProperty(PropertyName = "Discord Logging Channels")]
  525. public List<Channel> Channels { get; set; }
  526.  
  527. [JsonProperty(PropertyName = "Discord Command Role Assignment (Empty = All roles can use command.)")]
  528. public Dictionary<string, List<string>> Commandroles { get; set; }
  529.  
  530. public class Channel
  531. {
  532. [JsonProperty(PropertyName = "Discord Channel ID #")]
  533. public Snowflake Channelid { get; set; }
  534.  
  535. [JsonProperty(PropertyName = "Channel Flags")]
  536. public List<string> perms { get; set; }
  537.  
  538. [JsonProperty(PropertyName = "Custom: Words/Phrases to Log")]
  539. public List<string> CustomFilter { get; set; }
  540.  
  541. [JsonIgnore]
  542. public readonly StringBuilder FilterBuilder = new StringBuilder();
  543.  
  544. [JsonIgnore]
  545. public Timer Timer;
  546. }
  547. }
  548.  
  549. public class GeneralSettings
  550. {
  551. [JsonProperty(PropertyName = "API Key (Bot Token)")]
  552. public string Apikey { get; set; }
  553.  
  554. [JsonProperty(PropertyName = "Auto Reload Plugin")]
  555. public bool AutoReloadPlugin { get; set; }
  556.  
  557. [JsonProperty(PropertyName = "Auto Reload Time (Seconds)")]
  558. public int AutoReloadTime { get; set; }
  559.  
  560. [JsonProperty(PropertyName = "Enable Bot Status")]
  561. public bool EnableBotStatus { get; set; }
  562.  
  563. [JsonProperty(PropertyName = "In-Game Report Command")]
  564. public string ReportCommand { get; set; }
  565.  
  566. [JsonConverter(typeof(StringEnumConverter))]
  567. [DefaultValue(DiscordLogLevel.Info)]
  568. [JsonProperty(PropertyName = "Discord Extension Log Level (Verbose/Debug/Info/Warning/Error/Exception/Off)")]
  569. public DiscordLogLevel ExtensionDebugging { get; set; } = DiscordLogLevel.Info;
  570. }
  571.  
  572. public class DiscordSideSettings
  573. {
  574. [JsonProperty(PropertyName = "Discord Command Prefix")]
  575. public string Commandprefix { get; set; }
  576.  
  577. [JsonProperty(PropertyName = "Discord to Game Chat: Icon (Steam ID)")]
  578. public ulong GameChatIconSteamID { get; set; }
  579.  
  580. [JsonProperty(PropertyName = "Discord to Game Chat: Tag")]
  581. public string GameChatTag { get; set; }
  582.  
  583. [JsonProperty(PropertyName = "Discord to Game Chat: Tag Color (Hex)")]
  584. public string GameChatTagColor { get; set; }
  585.  
  586. [JsonProperty(PropertyName = "Discord to Game Chat: Player Name Color (Hex)")]
  587. public string GameChatNameColor { get; set; }
  588.  
  589. [JsonProperty(PropertyName = "Discord to Game Chat: Message Color (Hex)")]
  590. public string GameChatTextColor { get; set; }
  591. }
  592.  
  593. public class GameLogSettings
  594. {
  595. [JsonProperty(PropertyName = "Enable Logging: Player Chat")]
  596. public bool LogChat { get; set; }
  597.  
  598. [JsonProperty(PropertyName = "Enable Logging: Joins & Quits")]
  599. public bool LogJoinQuits { get; set; }
  600.  
  601. [JsonProperty(PropertyName = "Enable Logging: Deaths")]
  602. public bool LogDeaths { get; set; }
  603.  
  604. [JsonProperty(PropertyName = "Enable Logging: Vehicle Spawns (Heli/APC/Plane/Ship)")]
  605. public bool LogVehicleSpawns { get; set; }
  606.  
  607. [JsonProperty(PropertyName = "Enable Logging: Crate Drops (Hackable/Supply)")]
  608. public bool LogCrateDrops { get; set; }
  609.  
  610. [JsonProperty(PropertyName = "Enable Logging: Usergroup Changes")]
  611. public bool LogUserGroups { get; set; }
  612.  
  613. [JsonProperty(PropertyName = "Enable Logging: Permission Changes")]
  614. public bool LogPermissions { get; set; }
  615.  
  616. [JsonProperty(PropertyName = "Enable Logging: Kicks & Bans")]
  617. public bool LogKickBans { get; set; }
  618.  
  619. [JsonProperty(PropertyName = "Enable Logging: Player Name Changes")]
  620. public bool LogNameChanges { get; set; }
  621.  
  622. [JsonProperty(PropertyName = "Enable Logging: Server Commands (Gestures/Note Edits)")]
  623. public bool LogServerCommands { get; set; }
  624.  
  625. [JsonProperty(PropertyName = "Enable Logging: Server Messages (Give/Item Spawns)")]
  626. public bool LogServerMessages { get; set; }
  627.  
  628. [JsonProperty(PropertyName = "Enable Logging: Player F7 Reports")]
  629. public bool LogF7Reports { get; set; }
  630.  
  631. [JsonProperty(PropertyName = "Enable Logging: Team Changes")]
  632. public bool LogTeams { get; set; }
  633.  
  634. [JsonProperty(PropertyName = "Enable Logging: RCON Connections")]
  635. public bool LogRCON { get; set; }
  636.  
  637. [JsonProperty(PropertyName = "Enable Logging: Spectates")]
  638. public bool LogSpectates { get; set; }
  639.  
  640. [JsonProperty(PropertyName = "Enable Logging: Server Wipe")]
  641. public bool LogServerWipe { get; set; }
  642.  
  643. [JsonProperty(PropertyName = "Enable Custom Logging")]
  644. public bool EnableCustomLogging { get; set; }
  645. }
  646.  
  647. public class PluginLogSettings
  648. {
  649. [JsonProperty(PropertyName = "Enable Logging: AdminHammer")]
  650. public bool LogPluginAdminHammer { get; set; }
  651.  
  652. [JsonProperty(PropertyName = "Enable Logging: Admin Radar")]
  653. public bool LogPluginAdminRadar { get; set; }
  654.  
  655. [JsonProperty(PropertyName = "Enable Logging: Better Chat Mute")]
  656. public bool LogPluginBetterChatMute { get; set; }
  657.  
  658. [JsonProperty(PropertyName = "Enable Logging: Clans")]
  659. public bool LogPluginClans { get; set; }
  660.  
  661. [JsonProperty(PropertyName = "Enable Logging: Dangerous Treasures")]
  662. public bool LogPluginDangerousTreasures { get; set; }
  663.  
  664. [JsonProperty(PropertyName = "Enable Logging: Discord Auth")]
  665. public bool LogPluginDiscordAuth { get; set; }
  666.  
  667. [JsonProperty(PropertyName = "Enable Logging: Godmode")]
  668. public bool LogPluginGodmode { get; set; }
  669.  
  670. [JsonProperty(PropertyName = "Enable Logging: Kits")]
  671. public bool LogPluginKits { get; set; }
  672.  
  673. [JsonProperty(PropertyName = "Enable Logging: Private Messages")]
  674. public bool LogPluginPrivateMessages { get; set; }
  675.  
  676. [JsonProperty(PropertyName = "Enable Logging: Raidable Bases")]
  677. public bool LogPluginRaidableBases { get; set; }
  678.  
  679. [JsonProperty(PropertyName = "Enable Logging: Sign Artist")]
  680. public bool LogPluginSignArtist { get; set; }
  681.  
  682. [JsonProperty(PropertyName = "Enable Logging: Vanish")]
  683. public bool LogPluginVanish { get; set; }
  684. }
  685. public class PremiumPluginLogSettings
  686. {
  687. [JsonProperty(PropertyName = "Enable Logging: Air Event")]
  688. public bool LogPluginAirEvent { get; set; }
  689.  
  690. [JsonProperty(PropertyName = "Enable Logging: Armored Train Event")]
  691. public bool LogPluginArmoredTrainEvent { get; set; }
  692.  
  693. [JsonProperty(PropertyName = "Enable Logging: Cargo Train Event")]
  694. public bool LogPluginCargoTrainEvent { get; set; }
  695.  
  696. [JsonProperty(PropertyName = "Enable Logging: Convoy Event")]
  697. public bool LogPluginConvoyEvent { get; set; }
  698.  
  699. [JsonProperty(PropertyName = "Enable Logging: Harbor Event")]
  700. public bool LogPluginHarborEvent { get; set; }
  701.  
  702. [JsonProperty(PropertyName = "Enable Logging: Junkyard Event")]
  703. public bool LogPluginJunkyardEvent { get; set; }
  704.  
  705. [JsonProperty(PropertyName = "Enable Logging: Power Plant Event")]
  706. public bool LogPluginPowerPlantEvent { get; set; }
  707.  
  708. [JsonProperty(PropertyName = "Enable Logging: Satellite Dish Event")]
  709. public bool LogPluginSatDishEvent { get; set; }
  710.  
  711. [JsonProperty(PropertyName = "Enable Logging: Sputnik Event")]
  712. public bool LogPluginSputnikEvent { get; set; }
  713.  
  714. [JsonProperty(PropertyName = "Enable Logging: Water Event")]
  715. public bool LogPluginWaterEvent { get; set; }
  716. }
  717.  
  718. public class OutputSettings
  719. {
  720. [JsonProperty(PropertyName = "Output Type: Bans (Simple/Embed)")]
  721. public string OutputTypeBans { get; set; }
  722.  
  723. [JsonProperty(PropertyName = "Output Type: Bug Report (Simple/Embed)")]
  724. public string OutputTypeBugs { get; set; }
  725.  
  726. [JsonProperty(PropertyName = "Output Type: Deaths (Simple/Embed/DeathNotes)")]
  727. public string OutputTypeDeaths { get; set; }
  728.  
  729. [JsonProperty(PropertyName = "Output Type: F7 Reports (Simple/Embed)")]
  730. public string OutputTypeF7Report { get; set; }
  731.  
  732. [JsonProperty(PropertyName = "Output Type: Join/Quit (Simple/Embed)")]
  733. public string OutputTypeJoinQuit { get; set; }
  734.  
  735. [JsonProperty(PropertyName = "Output Type: Join Player Info (Admin Channel) (Simple/Embed)")]
  736. public string OutputTypeJoinAdminChan { get; set; }
  737.  
  738. [JsonProperty(PropertyName = "Output Type: Kicks (Simple/Embed)")]
  739. public string OutputTypeKicks { get; set; }
  740.  
  741. [JsonProperty(PropertyName = "Output Type: Note Logging (Simple/Embed)")]
  742. public string OutputTypeNoteLog { get; set; }
  743.  
  744. [JsonProperty(PropertyName = "Output Type: Player Name Change (Simple/Embed)")]
  745. public string OutputTypeNameChange { get; set; }
  746.  
  747. [JsonProperty(PropertyName = "Output Type: /Report (Simple/Embed)")]
  748. public string OutputTypeReports { get; set; }
  749.  
  750. [JsonProperty(PropertyName = "Output Type: Server Wipe (Simple/Embed)")]
  751. public string OutputTypeServerWipe { get; set; }
  752.  
  753. [JsonProperty(PropertyName = "Output Type: Teams (Simple/Embed)")]
  754. public string OutputTypeTeams { get; set; }
  755.  
  756. [JsonProperty(PropertyName = "Output Type (Plugin): Admin Hammer (Simple/Embed)")]
  757. public string OutputTypeAdminHammer { get; set; }
  758.  
  759. [JsonProperty(PropertyName = "Output Type (Plugin): Admin Radar (Simple/Embed)")]
  760. public string OutputTypeAdminRadar { get; set; }
  761.  
  762. [JsonProperty(PropertyName = "Output Type (Plugin): Better Chat Mute (Simple/Embed)")]
  763. public string OutputTypeBetterChatMute { get; set; }
  764.  
  765. [JsonProperty(PropertyName = "Output Type (Plugin): Clans (Simple/Embed)")]
  766. public string OutputTypeClans { get; set; }
  767.  
  768. [JsonProperty(PropertyName = "Output Type (Plugin): Dangerous Treasures (Simple/Embed)")]
  769. public string OutputTypeDangerousTreasures { get; set; }
  770.  
  771. [JsonProperty(PropertyName = "Output Type (Plugin): Discord Auth (Simple/Embed)")]
  772. public string OutputTypeDiscordAuth { get; set; }
  773.  
  774. [JsonProperty(PropertyName = "Output Type (Plugin): Godmode (Simple/Embed)")]
  775. public string OutputTypeGodmode { get; set; }
  776.  
  777. [JsonProperty(PropertyName = "Output Type (Plugin): Kits (Simple/Embed)")]
  778. public string OutputTypeKits { get; set; }
  779.  
  780. [JsonProperty(PropertyName = "Output Type (Plugin): Private Messages (Simple/Embed)")]
  781. public string OutputTypePMs { get; set; }
  782.  
  783. [JsonProperty(PropertyName = "Output Type (Plugin): Raidable Bases (Simple/Embed)")]
  784. public string OutputTypeRaidableBases { get; set; }
  785.  
  786. [JsonProperty(PropertyName = "Output Type (Plugin): Vanish (Simple/Embed)")]
  787. public string OutputTypeVanish { get; set; }
  788.  
  789. [JsonProperty(PropertyName = "Output Type (Premium Plugin): AirEvent (Simple/Embed)")]
  790. public string OutputTypeAirEvent { get; set; }
  791.  
  792. [JsonProperty(PropertyName = "Output Type (Premium Plugin): ArmoredTrainEvent (Simple/Embed)")]
  793. public string OutputTypeArmoredTrainEvent { get; set; }
  794.  
  795. [JsonProperty(PropertyName = "Output Type (Premium Plugin): CargoTrainEvent (Simple/Embed)")]
  796. public string OutputTypeCargoTrainEvent { get; set; }
  797.  
  798. [JsonProperty(PropertyName = "Output Type (Premium Plugin): ConvoyEvent (Simple/Embed)")]
  799. public string OutputTypeConvoyEvent { get; set; }
  800.  
  801. [JsonProperty(PropertyName = "Output Type (Premium Plugin): HarborEvent (Simple/Embed)")]
  802. public string OutputTypeHarborEvent { get; set; }
  803.  
  804. [JsonProperty(PropertyName = "Output Type (Premium Plugin): JunkyardEvent (Simple/Embed)")]
  805. public string OutputTypeJunkyardEvent { get; set; }
  806.  
  807. [JsonProperty(PropertyName = "Output Type (Premium Plugin): PowerPlantEvent (Simple/Embed)")]
  808. public string OutputTypePowerPlantEvent { get; set; }
  809.  
  810. [JsonProperty(PropertyName = "Output Type (Premium Plugin): SatDishEvent (Simple/Embed)")]
  811. public string OutputTypeSatDishEvent { get; set; }
  812.  
  813. [JsonProperty(PropertyName = "Output Type (Premium Plugin): SputnikEvent (Simple/Embed)")]
  814. public string OutputTypeSputnikEvent { get; set; }
  815.  
  816. [JsonProperty(PropertyName = "Output Type (Premium Plugin): WaterEvent (Simple/Embed)")]
  817. public string OutputTypeWaterEvent { get; set; }
  818. }
  819.  
  820. public class ExcludedSettings
  821. {
  822. [JsonProperty(PropertyName = "Exclude Listed Groups From log_groups")]
  823. public List<string> LogExcludeGroups { get; set; }
  824.  
  825. [JsonProperty(PropertyName = "Exclude Listed Permissions From log_perms")]
  826. public List<string> LogExcludePerms { get; set; }
  827. }
  828.  
  829. public class FilterSettings
  830. {
  831. [JsonProperty(PropertyName = "Chat Filter: Replacement Word")]
  832. public string FilteredWord { get; set; }
  833.  
  834. [JsonProperty(PropertyName = "Chat Filter: Words to Filter")]
  835. public List<string> FilterWords { get; set; }
  836. }
  837. #endregion
  838.  
  839. #region Default Config
  840. private Settings GetDefaultSettings()
  841. {
  842. return new Settings
  843. {
  844. General = new GeneralSettings
  845. {
  846. Apikey = "BotToken",
  847. AutoReloadPlugin = false,
  848. AutoReloadTime = 901,
  849. EnableBotStatus = false,
  850. ReportCommand = "report",
  851. ExtensionDebugging = DiscordLogLevel.Info
  852. },
  853. DiscordSide = new DiscordSideSettings
  854. {
  855. Commandprefix = "!",
  856. GameChatIconSteamID = 76561199066612103,
  857. GameChatTag = "[RUSTCORD]",
  858. GameChatTagColor = "#7289DA",
  859. GameChatNameColor = "#55aaff",
  860. GameChatTextColor = "#ffffff",
  861. },
  862. GameLog = new GameLogSettings
  863. {
  864. LogChat = true,
  865. LogJoinQuits = true,
  866. LogDeaths = false,
  867. LogVehicleSpawns = false,
  868. LogCrateDrops = false,
  869. LogUserGroups = false,
  870. LogPermissions = false,
  871. LogKickBans = true,
  872. LogNameChanges = false,
  873. LogServerCommands = false,
  874. LogServerMessages = false,
  875. LogF7Reports = false,
  876. LogTeams = false,
  877. LogRCON = false,
  878. LogSpectates = false,
  879. LogServerWipe = false,
  880. EnableCustomLogging = false
  881. },
  882. PluginLog = new PluginLogSettings
  883. {
  884. LogPluginAdminHammer = false,
  885. LogPluginAdminRadar = false,
  886. LogPluginBetterChatMute = false,
  887. LogPluginClans = false,
  888. LogPluginDangerousTreasures = false,
  889. LogPluginDiscordAuth = false,
  890. LogPluginGodmode = false,
  891. LogPluginKits = false,
  892. LogPluginPrivateMessages = false,
  893. LogPluginRaidableBases = false,
  894. LogPluginSignArtist = false,
  895. LogPluginVanish = false
  896. },
  897. PremiumPluginLog = new PremiumPluginLogSettings
  898. {
  899. LogPluginAirEvent = false,
  900. LogPluginArmoredTrainEvent = false,
  901. LogPluginCargoTrainEvent = false,
  902. LogPluginConvoyEvent = false,
  903. LogPluginHarborEvent = false,
  904. LogPluginJunkyardEvent = false,
  905. LogPluginPowerPlantEvent = false,
  906. LogPluginSputnikEvent = false,
  907. LogPluginSatDishEvent = false,
  908. LogPluginWaterEvent = false
  909. },
  910. OutputFormat = new OutputSettings
  911. {
  912. OutputTypeBans = "Simple",
  913. OutputTypeBugs = "Simple",
  914. OutputTypeDeaths = "Simple",
  915. OutputTypeF7Report = "Simple",
  916. OutputTypeJoinQuit = "Simple",
  917. OutputTypeJoinAdminChan = "Simple",
  918. OutputTypeKicks = "Simple",
  919. OutputTypeNameChange = "Simple",
  920. OutputTypeNoteLog = "Simple",
  921. OutputTypeReports = "Simple",
  922. OutputTypeServerWipe = "Simple",
  923. OutputTypeTeams = "Simple",
  924. OutputTypeAdminHammer = "Simple",
  925. OutputTypeAdminRadar = "Simple",
  926. OutputTypeBetterChatMute = "Simple",
  927. OutputTypeClans = "Simple",
  928. OutputTypeDangerousTreasures = "Simple",
  929. OutputTypeDiscordAuth = "Simple",
  930. OutputTypeGodmode = "Simple",
  931. OutputTypeKits = "Simple",
  932. OutputTypePMs = "Simple",
  933. OutputTypeRaidableBases = "Simple",
  934. OutputTypeVanish = "Simple",
  935. OutputTypeAirEvent = "Simple",
  936. OutputTypeArmoredTrainEvent = "Simple",
  937. OutputTypeCargoTrainEvent = "Simple",
  938. OutputTypeConvoyEvent = "Simple",
  939. OutputTypeHarborEvent = "Simple",
  940. OutputTypeJunkyardEvent = "Simple",
  941. OutputTypePowerPlantEvent = "Simple",
  942. OutputTypeSputnikEvent = "Simple",
  943. OutputTypeSatDishEvent = "Simple",
  944. OutputTypeWaterEvent = "Simple"
  945. },
  946.  
  947. Channels = new List<Settings.Channel>
  948. {
  949. new Settings.Channel
  950. {
  951. perms = new List<string>
  952. {
  953. "cmd_allow",
  954. "cmd_players",
  955. "cmd_kick",
  956. "cmd_com",
  957. "cmd_mute",
  958. "cmd_unmute",
  959. "msg_join",
  960. "msg_quit",
  961. "death_pvp",
  962. "msg_chat",
  963. "game_bug",
  964. "msg_serverinit"
  965. },
  966. CustomFilter = new List<string>
  967. {
  968. "keyword1",
  969. "keyword2"
  970. }
  971. },
  972. new Settings.Channel
  973. {
  974. perms = new List<string>
  975. {
  976. "msg_joinlog",
  977. "game_report",
  978. "msg_teamchat",
  979. "game_bug"
  980. },
  981. CustomFilter = new List<string>
  982. {
  983. "keyword1",
  984. "keyword2"
  985. }
  986. }
  987. },
  988. Commandroles = new Dictionary<string, List<string>>
  989. {
  990. {
  991. "players", new List<string>()
  992. {
  993. "DiscordRoleName",
  994. "DiscordRoleName2"
  995. }
  996. },
  997. {
  998. "mute", new List<string>()
  999. {
  1000. "DiscordRoleName",
  1001. "DiscordRoleName2"
  1002. }
  1003. },
  1004. {
  1005. "unmute", new List<string>()
  1006. {
  1007. "DiscordRoleName",
  1008. "DiscordRoleName2"
  1009. }
  1010. },
  1011. {
  1012. "kick", new List<string>()
  1013. {
  1014. "DiscordRoleName",
  1015. "DiscordRoleName2"
  1016. }
  1017. },
  1018. {
  1019. "ban", new List<string>()
  1020. {
  1021. "DiscordRoleName",
  1022. "DiscordRoleName2"
  1023. }
  1024. },
  1025. {
  1026. "timeban", new List<string>()
  1027. {
  1028. "DiscordRoleName",
  1029. "DiscordRoleName2"
  1030. }
  1031. },
  1032. {
  1033. "unban", new List<string>()
  1034. {
  1035. "DiscordRoleName",
  1036. "DiscordRoleName2"
  1037. }
  1038. },
  1039. {
  1040. "com", new List<string>()
  1041. {
  1042. "DiscordRoleName",
  1043. "DiscordRoleName2"
  1044. }
  1045. }
  1046. },
  1047. Filters = new FilterSettings
  1048. {
  1049. FilterWords = new List<string>
  1050. {
  1051. "badword1",
  1052. "badword2"
  1053. },
  1054. FilteredWord = "<censored>",
  1055. },
  1056. Excluded = new ExcludedSettings
  1057. {
  1058. LogExcludeGroups = new List<string>
  1059. {
  1060. "example-group1",
  1061. "example-group2"
  1062. },
  1063. LogExcludePerms = new List<string>
  1064. {
  1065. "example.permission1",
  1066. "example.permission2"
  1067. }
  1068. },
  1069.  
  1070. };
  1071. }
  1072.  
  1073. protected override void LoadDefaultConfig()
  1074. {
  1075. PrintWarning("Attempting to create default config...");
  1076. Config.Clear();
  1077. Config.WriteObject(GetDefaultSettings(), true);
  1078. Config.Save();
  1079. }
  1080. #endregion
  1081.  
  1082. #region Hooks
  1083. void SubscribeHooks()
  1084. {
  1085. if (_settings.GameLog.LogChat) Subscribe(nameof(OnPlayerChat));
  1086. if (_settings.GameLog.LogJoinQuits)
  1087. {
  1088. Subscribe(nameof(OnPlayerConnected));
  1089. Subscribe(nameof(OnPlayerDisconnected));
  1090. }
  1091.  
  1092.  
  1093.  
  1094. if (_settings.GameLog.LogDeaths)
  1095. {
  1096. if (_settings.OutputFormat.OutputTypeDeaths == "DeathNotes") Subscribe(nameof(OnDeathNotice));
  1097. if ((_settings.OutputFormat.OutputTypeDeaths == "Simple") || (_settings.OutputFormat.OutputTypeDeaths == "Embed")) Subscribe(nameof(OnPlayerDeath));
  1098. }
  1099.  
  1100.  
  1101. if (_settings.GameLog.LogVehicleSpawns) Subscribe(nameof(OnEntitySpawned));
  1102. if (_settings.GameLog.LogCrateDrops)
  1103. {
  1104. Subscribe(nameof(OnCrateDropped));
  1105. Subscribe(nameof(OnSupplyDropLanded));
  1106. }
  1107. if (_settings.GameLog.LogUserGroups)
  1108. {
  1109. Subscribe(nameof(OnGroupCreated));
  1110. Subscribe(nameof(OnGroupDeleted));
  1111. Subscribe(nameof(OnUserGroupAdded));
  1112. Subscribe(nameof(OnUserGroupRemoved));
  1113. }
  1114. if (_settings.GameLog.LogPermissions)
  1115. {
  1116. Subscribe(nameof(OnUserPermissionGranted));
  1117. Subscribe(nameof(OnGroupPermissionGranted));
  1118. Subscribe(nameof(OnUserPermissionRevoked));
  1119. Subscribe(nameof(OnGroupPermissionRevoked));
  1120. }
  1121. if (_settings.GameLog.LogKickBans)
  1122. {
  1123. Subscribe(nameof(OnUserKicked));
  1124. Subscribe(nameof(OnUserBanned));
  1125. Subscribe(nameof(OnUserUnbanned));
  1126. }
  1127. if (_settings.GameLog.LogNameChanges) Subscribe(nameof(OnUserNameUpdated));
  1128. if (_settings.GameLog.LogServerMessages) Subscribe(nameof(OnServerMessage));
  1129. if (_settings.GameLog.LogServerCommands) Subscribe(nameof(OnServerCommand));
  1130. if (_settings.GameLog.LogF7Reports) Subscribe(nameof(OnPlayerReported));
  1131. if (_settings.GameLog.LogServerWipe) Subscribe(nameof(OnNewSave));
  1132. if (_settings.GameLog.LogTeams)
  1133. {
  1134. Subscribe(nameof(OnTeamCreated));
  1135. Subscribe(nameof(OnTeamAcceptInvite));
  1136. Subscribe(nameof(OnTeamLeave));
  1137. Subscribe(nameof(OnTeamKick));
  1138. Subscribe(nameof(OnTeamDisbanded));
  1139. }
  1140. if (_settings.GameLog.LogRCON)
  1141. {
  1142. Subscribe(nameof(OnRconConnection));
  1143. }
  1144. if (_settings.GameLog.LogSpectates)
  1145. {
  1146. Subscribe(nameof(OnPlayerSpectate));
  1147. Subscribe(nameof(OnPlayerSpectateEnd));
  1148. }
  1149. if (_settings.PluginLog.LogPluginAdminHammer)
  1150. {
  1151. Subscribe(nameof(OnAdminHammerEnabled));
  1152. Subscribe(nameof(OnAdminHammerDisabled));
  1153. }
  1154. if (_settings.PluginLog.LogPluginAdminRadar)
  1155. {
  1156. Subscribe(nameof(OnRadarActivated));
  1157. Subscribe(nameof(OnRadarDeactivated));
  1158. }
  1159. if (_settings.PluginLog.LogPluginBetterChatMute)
  1160. {
  1161. Subscribe(nameof(OnBetterChatMuted));
  1162. Subscribe(nameof(OnBetterChatTimeMuted));
  1163. Subscribe(nameof(OnBetterChatUnmuted));
  1164. Subscribe(nameof(OnBetterChatMuteExpired));
  1165. }
  1166. if (_settings.PluginLog.LogPluginClans)
  1167. {
  1168. Subscribe(nameof(OnClanCreate));
  1169. Subscribe(nameof(OnClanDisbanded));
  1170. Subscribe(nameof(OnClanChat));
  1171. }
  1172. if (_settings.PluginLog.LogPluginDangerousTreasures)
  1173. {
  1174. Subscribe(nameof(OnDangerousEventStarted));
  1175. Subscribe(nameof(OnDangerousEventEnded));
  1176. }
  1177. if (_settings.PluginLog.LogPluginGodmode)
  1178. {
  1179. Subscribe(nameof(OnGodmodeToggled));
  1180. }
  1181. if (_settings.PluginLog.LogPluginKits)
  1182. {
  1183. Subscribe(nameof(OnKitRedeemed));
  1184. }
  1185. if (_settings.PluginLog.LogPluginPrivateMessages) Subscribe(nameof(OnPMProcessed));
  1186. if (_settings.PluginLog.LogPluginRaidableBases)
  1187. {
  1188. Subscribe(nameof(OnRaidableBaseStarted));
  1189. Subscribe(nameof(OnRaidableBaseEnded));
  1190. }
  1191. if (_settings.PluginLog.LogPluginSignArtist) Subscribe(nameof(OnImagePost));
  1192. if (_settings.PluginLog.LogPluginDiscordAuth)
  1193. {
  1194. Subscribe(nameof(OnDiscordPlayerLinked));
  1195. Subscribe(nameof(OnDiscordPlayerUnlinked));
  1196. }
  1197. if (_settings.PluginLog.LogPluginVanish)
  1198. {
  1199. Subscribe(nameof(OnVanishDisappear));
  1200. Subscribe(nameof(OnVanishReappear));
  1201. }
  1202. if (_settings.PremiumPluginLog.LogPluginAirEvent)
  1203. {
  1204. Subscribe(nameof(OnAirEventStart));
  1205. Subscribe(nameof(OnAirEventEnd));
  1206. }
  1207. if (_settings.PremiumPluginLog.LogPluginArmoredTrainEvent)
  1208. {
  1209. Subscribe(nameof(OnArmoredTrainEventStart));
  1210. Subscribe(nameof(OnArmoredTrainEventStop));
  1211. }
  1212. if (_settings.PremiumPluginLog.LogPluginCargoTrainEvent)
  1213. {
  1214. Subscribe(nameof(OnTrainEventStarted));
  1215. Subscribe(nameof(OnTrainEventEnded));
  1216. }
  1217. if (_settings.PremiumPluginLog.LogPluginConvoyEvent)
  1218. {
  1219. Subscribe(nameof(OnConvoyStart));
  1220. Subscribe(nameof(OnConvoyStop));
  1221. }
  1222. if (_settings.PremiumPluginLog.LogPluginHarborEvent)
  1223. {
  1224. Subscribe(nameof(OnHarborEventStart));
  1225. Subscribe(nameof(OnHarborEventEnd));
  1226. }
  1227. if (_settings.PremiumPluginLog.LogPluginJunkyardEvent)
  1228. {
  1229. Subscribe(nameof(OnJunkyardEventStart));
  1230. Subscribe(nameof(OnJunkyardEventEnd));
  1231. }
  1232. if (_settings.PremiumPluginLog.LogPluginPowerPlantEvent)
  1233. {
  1234. Subscribe(nameof(OnPowerPlantEventStart));
  1235. Subscribe(nameof(OnPowerPlantEventEnd));
  1236. }
  1237. if (_settings.PremiumPluginLog.LogPluginSputnikEvent)
  1238. {
  1239. Subscribe(nameof(OnSputnikEventStart));
  1240. Subscribe(nameof(OnSputnikEventStop));
  1241. }
  1242. if (_settings.PremiumPluginLog.LogPluginSatDishEvent)
  1243. {
  1244. Subscribe(nameof(OnSatDishEventStart));
  1245. Subscribe(nameof(OnSatDishEventEnd));
  1246. }
  1247. if (_settings.PremiumPluginLog.LogPluginWaterEvent)
  1248. {
  1249. Subscribe(nameof(OnWaterEventStart));
  1250. Subscribe(nameof(OnWaterEventEnd));
  1251. }
  1252. }
  1253. private void Init()
  1254. {
  1255. cache[CacheType.OnPlayerChat] = new Dictionary<BasePlayer, Dictionary<string, string>>();
  1256. cache[CacheType.OnPlayerConnected] = new Dictionary<BasePlayer, Dictionary<string, string>>();
  1257. cache[CacheType.OnPlayerDisconnected] = new Dictionary<BasePlayer, Dictionary<string, string>>();
  1258. cache[CacheType.OnPlayerJoin] = new Dictionary<BasePlayer, Dictionary<string, string>>();
  1259. UnsubscribeHooks();
  1260. }
  1261.  
  1262. void UnsubscribeHooks()
  1263. {
  1264. Unsubscribe(nameof(OnPlayerChat));
  1265. Unsubscribe(nameof(OnPlayerConnected));
  1266. Unsubscribe(nameof(OnPlayerDisconnected));
  1267. Unsubscribe(nameof(OnDeathNotice));
  1268. Unsubscribe(nameof(OnPlayerDeath));
  1269. Unsubscribe(nameof(OnEntitySpawned));
  1270. Unsubscribe(nameof(OnCrateDropped));
  1271. Unsubscribe(nameof(OnSupplyDropLanded));
  1272. Unsubscribe(nameof(OnGroupCreated));
  1273. Unsubscribe(nameof(OnGroupDeleted));
  1274. Unsubscribe(nameof(OnUserGroupAdded));
  1275. Unsubscribe(nameof(OnUserGroupRemoved));
  1276. Unsubscribe(nameof(OnUserPermissionGranted));
  1277. Unsubscribe(nameof(OnGroupPermissionGranted));
  1278. Unsubscribe(nameof(OnUserPermissionRevoked));
  1279. Unsubscribe(nameof(OnGroupPermissionRevoked));
  1280. Unsubscribe(nameof(OnUserKicked));
  1281. Unsubscribe(nameof(OnUserBanned));
  1282. Unsubscribe(nameof(OnUserUnbanned));
  1283. Unsubscribe(nameof(OnUserNameUpdated));
  1284. Unsubscribe(nameof(OnServerMessage));
  1285. Unsubscribe(nameof(OnServerCommand));
  1286. Unsubscribe(nameof(OnPlayerReported));
  1287. Unsubscribe(nameof(OnTeamCreated));
  1288. Unsubscribe(nameof(OnTeamAcceptInvite));
  1289. Unsubscribe(nameof(OnTeamLeave));
  1290. Unsubscribe(nameof(OnTeamKick));
  1291. Unsubscribe(nameof(OnTeamDisbanded));
  1292. Unsubscribe(nameof(OnRconConnection));
  1293. Unsubscribe(nameof(OnPlayerSpectate));
  1294. Unsubscribe(nameof(OnPlayerSpectateEnd));
  1295. Unsubscribe(nameof(OnAdminHammerEnabled));
  1296. Unsubscribe(nameof(OnAdminHammerDisabled));
  1297. Unsubscribe(nameof(OnRadarActivated));
  1298. Unsubscribe(nameof(OnRadarDeactivated));
  1299. Unsubscribe(nameof(OnBetterChatTimeMuted));
  1300. Unsubscribe(nameof(OnBetterChatMuted));
  1301. Unsubscribe(nameof(OnBetterChatTimeMuted));
  1302. Unsubscribe(nameof(OnBetterChatUnmuted));
  1303. Unsubscribe(nameof(OnBetterChatMuteExpired));
  1304. Unsubscribe(nameof(OnClanCreate));
  1305. Unsubscribe(nameof(OnClanDisbanded));
  1306. Unsubscribe(nameof(OnClanChat));
  1307. Unsubscribe(nameof(OnPMProcessed));
  1308. Unsubscribe(nameof(OnImagePost));
  1309. Unsubscribe(nameof(OnDiscordPlayerLinked));
  1310. Unsubscribe(nameof(OnDiscordPlayerUnlinked));
  1311. Unsubscribe(nameof(OnRaidableBaseStarted));
  1312. Unsubscribe(nameof(OnRaidableBaseEnded));
  1313. Unsubscribe(nameof(OnGodmodeToggled));
  1314. Unsubscribe(nameof(OnKitRedeemed));
  1315. Unsubscribe(nameof(OnDangerousEventStarted));
  1316. Unsubscribe(nameof(OnDangerousEventEnded));
  1317. Unsubscribe(nameof(OnAirEventStart));
  1318. Unsubscribe(nameof(OnAirEventEnd));
  1319. Unsubscribe(nameof(OnArmoredTrainEventStart));
  1320. Unsubscribe(nameof(OnArmoredTrainEventStop));
  1321. Unsubscribe(nameof(OnTrainEventStarted));
  1322. Unsubscribe(nameof(OnTrainEventEnded));
  1323. Unsubscribe(nameof(OnConvoyStart));
  1324. Unsubscribe(nameof(OnConvoyStop));
  1325. Unsubscribe(nameof(OnHarborEventStart));
  1326. Unsubscribe(nameof(OnHarborEventEnd));
  1327. Unsubscribe(nameof(OnJunkyardEventStart));
  1328. Unsubscribe(nameof(OnJunkyardEventEnd));
  1329. Unsubscribe(nameof(OnPowerPlantEventStart));
  1330. Unsubscribe(nameof(OnPowerPlantEventEnd));
  1331. Unsubscribe(nameof(OnSatDishEventStart));
  1332. Unsubscribe(nameof(OnSatDishEventEnd));
  1333. Unsubscribe(nameof(OnSputnikEventStart));
  1334. Unsubscribe(nameof(OnSputnikEventStop));
  1335. Unsubscribe(nameof(OnWaterEventStart));
  1336. Unsubscribe(nameof(OnWaterEventEnd));
  1337. }
  1338. #endregion
  1339.  
  1340. #region Null Config Check
  1341. private void Loaded()
  1342. {
  1343. _settings = Config.ReadObject<Settings>();
  1344.  
  1345. // Make sure objects are not taken off the config, otherwise some parts of code will release NRE.
  1346.  
  1347. if (_settings.OutputFormat.OutputTypeBans == null)
  1348. _settings.OutputFormat.OutputTypeBans = "Simple";
  1349. if (_settings.OutputFormat.OutputTypeBugs == null)
  1350. _settings.OutputFormat.OutputTypeBugs = "Simple";
  1351. if (_settings.OutputFormat.OutputTypeDeaths == null)
  1352. _settings.OutputFormat.OutputTypeDeaths = "Simple";
  1353. if (_settings.OutputFormat.OutputTypeF7Report == null)
  1354. _settings.OutputFormat.OutputTypeF7Report = "Simple";
  1355. if (_settings.OutputFormat.OutputTypeJoinQuit == null)
  1356. _settings.OutputFormat.OutputTypeJoinQuit = "Simple";
  1357. if (_settings.OutputFormat.OutputTypeJoinAdminChan == null)
  1358. _settings.OutputFormat.OutputTypeJoinAdminChan = "Simple";
  1359. if (_settings.OutputFormat.OutputTypeKicks == null)
  1360. _settings.OutputFormat.OutputTypeKicks = "Simple";
  1361. if (_settings.OutputFormat.OutputTypeNameChange == null)
  1362. _settings.OutputFormat.OutputTypeNameChange = "Simple";
  1363. if (_settings.OutputFormat.OutputTypeNoteLog == null)
  1364. _settings.OutputFormat.OutputTypeNoteLog = "Simple";
  1365. if (_settings.OutputFormat.OutputTypeReports == null)
  1366. _settings.OutputFormat.OutputTypeReports = "Simple";
  1367. if (_settings.OutputFormat.OutputTypeServerWipe == null)
  1368. _settings.OutputFormat.OutputTypeServerWipe = "Simple";
  1369. if (_settings.OutputFormat.OutputTypeTeams == null)
  1370. _settings.OutputFormat.OutputTypeTeams = "Simple";
  1371. if (_settings.OutputFormat.OutputTypeAdminHammer == null)
  1372. _settings.OutputFormat.OutputTypeAdminHammer = "Simple";
  1373. if (_settings.OutputFormat.OutputTypeAdminRadar == null)
  1374. _settings.OutputFormat.OutputTypeAdminRadar = "Simple";
  1375. if (_settings.OutputFormat.OutputTypeBetterChatMute == null)
  1376. _settings.OutputFormat.OutputTypeBetterChatMute = "Simple";
  1377. if (_settings.OutputFormat.OutputTypeClans == null)
  1378. _settings.OutputFormat.OutputTypeClans = "Simple";
  1379. if (_settings.OutputFormat.OutputTypeDangerousTreasures == null)
  1380. _settings.OutputFormat.OutputTypeDangerousTreasures = "Simple";
  1381. if (_settings.OutputFormat.OutputTypeDiscordAuth == null)
  1382. _settings.OutputFormat.OutputTypeDiscordAuth = "Simple";
  1383. if (_settings.OutputFormat.OutputTypeKits == null)
  1384. _settings.OutputFormat.OutputTypeKits = "Simple";
  1385. if (_settings.OutputFormat.OutputTypePMs == null)
  1386. _settings.OutputFormat.OutputTypePMs = "Simple";
  1387. if (_settings.OutputFormat.OutputTypeRaidableBases == null)
  1388. _settings.OutputFormat.OutputTypeRaidableBases = "Simple";
  1389. if (_settings.OutputFormat.OutputTypeVanish == null)
  1390. _settings.OutputFormat.OutputTypeVanish = "Simple";
  1391. if (_settings.OutputFormat.OutputTypeAirEvent == null)
  1392. _settings.OutputFormat.OutputTypeAirEvent = "Simple";
  1393. if (_settings.OutputFormat.OutputTypeArmoredTrainEvent == null)
  1394. _settings.OutputFormat.OutputTypeArmoredTrainEvent = "Simple";
  1395. if (_settings.OutputFormat.OutputTypeCargoTrainEvent == null)
  1396. _settings.OutputFormat.OutputTypeCargoTrainEvent = "Simple";
  1397. if (_settings.OutputFormat.OutputTypeConvoyEvent == null)
  1398. _settings.OutputFormat.OutputTypeConvoyEvent = "Simple";
  1399. if (_settings.OutputFormat.OutputTypeHarborEvent == null)
  1400. _settings.OutputFormat.OutputTypeHarborEvent = "Simple";
  1401. if (_settings.OutputFormat.OutputTypeJunkyardEvent == null)
  1402. _settings.OutputFormat.OutputTypeJunkyardEvent = "Simple";
  1403. if (_settings.OutputFormat.OutputTypePowerPlantEvent == null)
  1404. _settings.OutputFormat.OutputTypePowerPlantEvent = "Simple";
  1405. if (_settings.OutputFormat.OutputTypeSatDishEvent == null)
  1406. _settings.OutputFormat.OutputTypeSatDishEvent = "Simple";
  1407. if (_settings.OutputFormat.OutputTypeSputnikEvent == null)
  1408. _settings.OutputFormat.OutputTypeSputnikEvent = "Simple";
  1409. if (_settings.OutputFormat.OutputTypeWaterEvent == null)
  1410. _settings.OutputFormat.OutputTypeWaterEvent = "Simple";
  1411.  
  1412. foreach (var channel in _settings.Channels)
  1413. {
  1414. if (channel.CustomFilter == null)
  1415. {
  1416. channel.CustomFilter = new List<string>();
  1417. }
  1418. }
  1419. if (_settings.General.ReportCommand == null)
  1420. _settings.General.ReportCommand = "report";
  1421. if (string.IsNullOrEmpty(_settings.DiscordSide.GameChatTag))
  1422. _settings.DiscordSide.GameChatTag = "[Rustcord]";
  1423. if (string.IsNullOrEmpty(_settings.DiscordSide.GameChatTagColor))
  1424. _settings.DiscordSide.GameChatTagColor = "#7289DA";
  1425. if (string.IsNullOrEmpty(_settings.DiscordSide.GameChatNameColor))
  1426. _settings.DiscordSide.GameChatNameColor = "#55aaff";
  1427. if (string.IsNullOrEmpty(_settings.DiscordSide.GameChatTextColor))
  1428. _settings.DiscordSide.GameChatTextColor = "#ffffff";
  1429. if (_settings.DiscordSide.GameChatIconSteamID.Equals(0uL))
  1430. _settings.DiscordSide.GameChatIconSteamID = 76561199066612103;
  1431. if (_settings.Channels == null)
  1432. _settings.Channels = new List<Settings.Channel>();
  1433. if (_settings.Commandroles == null)
  1434. _settings.Commandroles = new Dictionary<string, List<string>>();
  1435. _settings.Filters = new FilterSettings
  1436. {
  1437. FilteredWord = _settings.Filters?.FilteredWord ?? "<censored>",
  1438. FilterWords = _settings.Filters?.FilterWords ?? new List<string>()
  1439. };
  1440. if (_settings.Excluded.LogExcludeGroups == null)
  1441. _settings.Excluded.LogExcludeGroups = new List<string>();
  1442. if (_settings.Excluded.LogExcludePerms == null)
  1443. _settings.Excluded.LogExcludePerms = new List<string>();
  1444.  
  1445. Config.WriteObject(_settings, true);
  1446. // ------------------------------------------------------------------------
  1447. }
  1448. #endregion
  1449.  
  1450. #region Language File
  1451. protected override void LoadDefaultMessages()
  1452. {
  1453. lang.RegisterMessages(new Dictionary<string, string>
  1454. {
  1455. { "Discord_PlayersResponse", ":mag_right: Connected Players [{playercount}/{maxplayers}]: {playerslist}" },
  1456. { "Discord_Status", "{playercount}/{maxplayers} Online, {sleepercount} Sleepers." },
  1457. { "RUST_OnInitMsg", ":vertical_traffic_light: Server is back online! Players may now re-join. :vertical_traffic_light:" },
  1458. { "RUST_OnServerShutdown", ":vertical_traffic_light: Server shutting down. :vertical_traffic_light:" },
  1459. { "RUST_OnPlayerGesture", ":speech_left: {playername}: {gesture}"},
  1460. { "RUST_OnPlayerChat", ":speech_left: {playername}: {message}"},
  1461. { "RUST_OnPlayerTeamChat", ":speech_left: {playername}: {message}"},
  1462. { "RUST_OnPlayerJoin", ":white_check_mark: {playername} has connected!" },
  1463. { "RUST_OnPlayerJoinAdminLog", ":clipboard: {playername} has connected! (IP: {playerip} SteamID: {playersteamid})" },
  1464. { "RUST_OnPlayerQuit", ":x: {playername} has disconnected! ({reason})" },
  1465. { "RUST_OnPlayerBug", ":beetle: {playername}: {message}"},
  1466. { "RUST_OnPlayerReport", ":warning: {playername}: {message}"},
  1467. { "RUST_OnPlaneSpawn", ":airplane: Cargo Plane has spawned."},
  1468. { "RUST_OnBradleySpawn", ":trolleybus: Bradley APC has spawned."},
  1469. { "RUST_OnShipSpawn", ":ship: Cargo Ship has spawned."},
  1470. { "RUST_OnSupplyDrop", ":airplane: A supply drop has landed."},
  1471. { "RUST_OnHeliSpawn", ":helicopter: Patrol Helicopter has spawned."},
  1472. { "RUST_OnChinookSpawn", ":helicopter: Chinook Helicopter has spawned."},
  1473. { "RUST_OnCrateDropped", ":helicopter: A Chinook has delivered a crate."},
  1474. { "RUST_OnTeamAcceptInvite", ":family_mwgb: {playername} joined {teamleader}'s team. ({teamid})"},
  1475. { "RUST_OnTeamCreated", ":family_mwgb: {playername} created a new team. ({teamid})"},
  1476. { "RUST_OnTeamKicked", ":family_mwgb: {teamleader} kicked {playername} from their team. ({teamid})"},
  1477. { "RUST_OnTeamLeave", ":family_mwgb: {playername} left {teamleader}'s team ({teamid})."},
  1478. { "RUST_OnTeamDisbanded", ":family_mwgb: {teamleader}'s team has been disbanded. ({teamid})"},
  1479. { "RUST_OnGroupCreated", ":desktop: Group {groupname} has been created."},
  1480. { "RUST_OnGroupDeleted", ":desktop: Group {groupname} has been deleted."},
  1481. { "RUST_OnUserGroupAdded", ":desktop: {playername} ({playersteamid}) has been added to group: {groupname}."},
  1482. { "RUST_OnUserGroupRemoved", ":desktop: {playername} ({playersteamid}) has been removed from group: {groupname}."},
  1483. { "RUST_OnUserPermissionGranted", ":desktop: {playername} ({playersteamid}) has been granted permission: {permission}."},
  1484. { "RUST_OnGroupPermissionGranted", ":desktop: Group {groupname} has been granted permission: {permission}."},
  1485. { "RUST_OnUserPermissionRevoked", ":desktop: {playername} ({playersteamid}) has been revoked permission: {permission}."},
  1486. { "RUST_OnGroupPermissionRevoked", ":desktop: Group {groupname} has been revoked permission: {permission}."},
  1487. { "RUST_OnPlayerKicked", ":desktop: {playername} has been kicked for: {reason}"},
  1488. { "RUST_OnPlayerBanned", ":desktop: {playername} ({playersteamid}/{playerip}) has been banned for: {reason}"}, //only works with vanilla/native system atm
  1489. { "RUST_OnPlayerUnBanned", ":desktop: {playername} ({playersteamid}/{playerip}) has been unbanned."}, //only works with vanilla/native system atm
  1490. { "RUST_OnPlayerNameChange", ":desktop: {oldname} ({playersteamid}) is now playing as {newname}."},
  1491. { "RUST_OnPlayerReported", ":desktop: {reporter} reported {targetname} ({targetsteamid}) to Facepunch for {reason}. Message: {message}"},
  1492. { "RUST_OnPlayerDeath", ":skull_crossbones: {killer} killed {victim}."},
  1493. { "RUST_OnF1ItemSpawn", ":desktop: {playername}: {givemessage}."},
  1494. { "RUST_OnNoteUpdate", ":desktop: [NOTES] {playername}: {notemessage}."},
  1495. { "RUST_OnRCONConnected", ":desktop: [RCON] New connection from: {ip}."},
  1496. { "RUST_OnPlayerSpectate", ":desktop: {playername} is spectating {targetname}"},
  1497.  
  1498. //Changed by Terceran 20240619
  1499. //{ "RUST_CustomLog", ":desktop: [Custom] {logtext}"},
  1500. { "RUST_CustomLog", " {logtext}"},
  1501. { "RUST_OnPlayerSpectateEnd", ":desktop: {playername} stopped spectating {targetname}"},
  1502. { "RUST_OnServerWipe", ":map: Server has started a fresh wipe!"},
  1503. { "PLUGIN_AdminHammer_Enabled", ":hammer: {playername} has enabled Admin Hammer."},
  1504. { "PLUGIN_AdminHammer_Disabled", ":hammer: {playername} has disabled Admin Hammer."},
  1505. { "PLUGIN_AdminRadar_Enabled", ":satellite: {playername} has enabled Admin Radar."},
  1506. { "PLUGIN_AdminRadar_Disabled", ":satellite: {playername} has disabled Admin Radar."},
  1507. { "PLUGIN_BetterChatMute_Mute", "[MUTE] :zipper_mouth: {muter} has permanently muted {targetname}. Reason: {reason}"},
  1508. { "PLUGIN_BetterChatMute_UnMute", "[MUTE] :loudspeaker: {unmuter} has unmuted {targetname}."},
  1509. { "PLUGIN_BetterChatMute_TimedMute", "[MUTE] :hourglass_flowing_sand: {muter} has been temporarily muted {targetname} for {duration}. Reason: {reason}"},
  1510. { "PLUGIN_BetterChatMute_MuteExpire", "[MUTE] :hourglass: {targetname}'s temporary mute has expired."},
  1511. { "PLUGIN_Clans_Chat", ":speech_left: [CLANS] {playername}: {message}"},
  1512. { "PLUGIN_Clans_CreateClan", ":family_mwgb: Clan [{clantag}] has been created."},
  1513. { "PLUGIN_Clans_DisbandClan", ":family_mwgb: Clan [{clantag}] has been disbanded."},
  1514. { "PLUGIN_DangerousTreasures_Started", ":moneybag: Dangerous Treasure event has started at {gridposition} {position}."},
  1515. { "PLUGIN_DangerousTreasures_Ended", ":moneybag: Dangerous Treasure event at {gridposition} has ended."},
  1516. { "PLUGIN_DeathNotes_Death", ":skull_crossbones: {deathmessage}"},
  1517. { "PLUGIN_DiscordAuth_Auth", ":lock: {gamename} has linked to Discord account {discordname}."},
  1518. { "PLUGIN_DiscordAuth_Deauth", ":unlock: {gamename} has been unlinked from Discord."},
  1519. { "PLUGIN_Godmode_Enabled", ":shield: {playername} has enabled God Mode."},
  1520. { "PLUGIN_Godmode_Disabled", ":shield: {playername} has disabled God Mode."},
  1521. { "PLUGIN_Kits_Redeemed", ":gift: {playername} redeemed kit: {kitname}."},
  1522. { "PLUGIN_PrivateMessages_PM", "[PM] {sendername} :incoming_envelope: {targetname}: {message}"},
  1523. { "PLUGIN_RaidableBases_Started", ":house: {difficulty} Raidable Base has spawned at {position}."},
  1524. { "PLUGIN_RaidableBases_Ended", ":house: {difficulty} Raidable Base at {position} has ended."},
  1525. { "PLUGIN_SignArtist", "{playername} posted an image to a sign.\nPosition: ({position})"},
  1526. { "PLUGIN_Vanish_Disappear", ":ghost: {playername} has vanished." },
  1527. { "PLUGIN_Vanish_Reappear", ":ghost: {playername} has reappeared." },
  1528. { "PLUGIN_AirEvent_Started", ":helicopter: Air Event has started." },
  1529. { "PLUGIN_AirEvent_Ended", ":helicopter: Air Event has ended." },
  1530. { "PLUGIN_ArmoredTrainEvent_Started", ":train2: Armored Train Event has started." },
  1531. { "PLUGIN_ArmoredTrainEvent_Ended", ":train2: Armored Train Event has ended." },
  1532. { "PLUGIN_CargoTrainEvent_Started", ":tram: Cargo Train Event has started." },
  1533. { "PLUGIN_CargoTrainEvent_Ended", ":tram: Cargo Train Event has ended." },
  1534. { "PLUGIN_ConvoyEvent_Started", ":truck: Convoy Event has started." },
  1535. { "PLUGIN_ConvoyEvent_Ended", ":truck: Convoy Event has ended." },
  1536. { "PLUGIN_HarborEvent_Started", ":ship: Harbor Event has started." },
  1537. { "PLUGIN_HarborEvent_Ended", ":ship: Harbor Event has ended." },
  1538. { "PLUGIN_JunkyardEvent_Started", ":construction_site: Junkyard Event has started." },
  1539. { "PLUGIN_JunkyardEvent_Ended", ":construction_site: Junkyard Event has ended." },
  1540. { "PLUGIN_PowerPlantEvent_Started", ":zap: Power Plant Event has started." },
  1541. { "PLUGIN_PowerPlantEvent_Ended", ":zap: Power Plant Event has ended." },
  1542. { "PLUGIN_SatDishEvent_Started", ":satellite: Satellite Dish Event has started." },
  1543. { "PLUGIN_SatDishEvent_Ended", ":satellite: Satellite Dish Event has ended." },
  1544. { "PLUGIN_SputnikEvent_Started", ":satellite_orbital: Sputnik Event has started." },
  1545. { "PLUGIN_SputnikEvent_Ended", ":satellite_orbital: Sputnik Dish Event has ended." },
  1546. { "PLUGIN_WaterEvent_Started", ":anchor: Water Event has started." },
  1547. { "PLUGIN_WaterEvent_Ended", ":anchor: Water Event has ended." }
  1548. }, this);
  1549. }
  1550. #endregion
  1551.  
  1552. #region Discord Commands
  1553. private void DiscordToGameCmd(string command, string param, DiscordUser author, Snowflake channelid)
  1554. {
  1555. switch (command)
  1556. {
  1557. case "players":
  1558. {
  1559. string listStr = string.Empty;
  1560. var pList = BasePlayer.activePlayerList;
  1561. int i = 0;
  1562. foreach (var player in pList)
  1563. {
  1564. listStr += player.displayName + " " + "[" + (i++ + 1) + "]";
  1565. if (i != pList.Count)
  1566. listStr += ", ";
  1567.  
  1568.  
  1569.  
  1570. if (i % 25 == 0 || i == pList.Count)
  1571. {
  1572. var text = new Dictionary<string, string>
  1573. {
  1574. ["playercount"] = Convert.ToString(BasePlayer.activePlayerList.Count),
  1575. ["maxplayers"] = Convert.ToString(ConVar.Server.maxplayers),
  1576. ["playerslist"] = listStr
  1577. };
  1578. GetChannel(Client, channelid, chan =>
  1579. {
  1580. chan.CreateMessage(Client, Translate("Discord_PlayersResponse", text));
  1581. });
  1582. text.Clear();
  1583. listStr = string.Empty;
  1584. }
  1585.  
  1586. }
  1587. if (pList.Count < 1)
  1588. {
  1589. GetChannel(Client, channelid, chan =>
  1590. {
  1591. chan.CreateMessage(Client, "Server is empty!");
  1592. });
  1593. }
  1594. break;
  1595. }
  1596. case "kick":
  1597. {
  1598. if (String.IsNullOrEmpty(param))
  1599. {
  1600. GetChannel(Client, channelid, chan =>
  1601. {
  1602. chan.CreateMessage(Client, "Syntax: !kick <steam id> <reason>");
  1603. });
  1604. return;
  1605. }
  1606. string[] _param = param.Split(' ');
  1607. if (_param.Length < 2)
  1608. {
  1609. GetChannel(Client, channelid, chan =>
  1610. {
  1611. chan.CreateMessage(Client, "Syntax: !kick <steam id> <reason>");
  1612. });
  1613. return;
  1614. }
  1615. BasePlayer plr = BasePlayer.Find(_param[0]);
  1616. if (plr == null)
  1617. {
  1618. GetChannel(Client, channelid, chan =>
  1619. {
  1620. chan.CreateMessage(Client, "Error: player not found");
  1621. });
  1622. return;
  1623. }
  1624. plr.Kick(param.Remove(0, _param[0].Length + 1));
  1625. GetChannel(Client, channelid, chan =>
  1626. {
  1627. chan.CreateMessage(Client, "Success: Kick command executed!");
  1628. });
  1629. break;
  1630. }
  1631. case "timeban":
  1632. {
  1633. if (string.IsNullOrEmpty(param))
  1634. {
  1635. GetChannel(Client, channelid, chan =>
  1636. {
  1637. chan.CreateMessage(Client, "Syntax: !timeban <steamid> <name> <duration> <reason>");
  1638. });
  1639. return;
  1640. }
  1641. string[] _param = param.Split(' ');
  1642. if (_param.Length < 3)
  1643. {
  1644. GetChannel(Client, channelid, chan =>
  1645. {
  1646. chan.CreateMessage(Client, "Syntax: !timeban <steamid> <name> <duration> <reason>");
  1647. });
  1648. return;
  1649. }
  1650. var plr = covalence.Players.FindPlayer(_param[0]);
  1651. if (plr == null)
  1652. {
  1653. GetChannel(Client, channelid, chan =>
  1654. {
  1655. chan.CreateMessage(Client, "Error: player not found");
  1656. });
  1657. return;
  1658. }
  1659. string[] args = new string[4];
  1660. args[0] = _param[0]; // id
  1661. args[1] = _param[1]; // name
  1662. args[2] = "\""; // reason
  1663. for (int i = 3; i < _param.Length; i++)
  1664. {
  1665. args[2] += _param[i];
  1666. if (i != _param.Length - 1)
  1667. args[2] += " ";
  1668. }
  1669. args[2] += "\"";
  1670. args[3] = _param[2];
  1671. this.Server.Command("banid", args);
  1672. GetChannel(Client, channelid, chan =>
  1673. {
  1674. chan.CreateMessage(Client, "Success: Ban command executed!");
  1675. });
  1676. break;
  1677. }
  1678. case "ban":
  1679. {
  1680. if (string.IsNullOrEmpty(param))
  1681. {
  1682. GetChannel(Client, channelid, chan =>
  1683. {
  1684. chan.CreateMessage(Client, "Syntax: !ban <name/id> <reason>");
  1685. });
  1686. return;
  1687. }
  1688. string[] _param = param.Split(' ');
  1689. if (_param.Length < 2)
  1690. {
  1691. GetChannel(Client, channelid, chan =>
  1692. {
  1693. chan.CreateMessage(Client, "Syntax: !ban <name/id> <reason>");
  1694. });
  1695. return;
  1696. }
  1697. var plr = covalence.Players.FindPlayer(_param[0]);
  1698. if (plr == null)
  1699. {
  1700. GetChannel(Client, channelid, chan =>
  1701. {
  1702. chan.CreateMessage(Client, "Error: player not found");
  1703. });
  1704. return;
  1705. }
  1706. plr.Ban(param.Remove(0, _param[0].Length + 1));
  1707. GetChannel(Client, channelid, chan =>
  1708. {
  1709. chan.CreateMessage(Client, "Success: Ban command executed!");
  1710. });
  1711. break;
  1712. }
  1713. case "unban":
  1714. {
  1715. if (string.IsNullOrEmpty(param))
  1716. {
  1717. GetChannel(Client, channelid, chan =>
  1718. {
  1719. chan.CreateMessage(Client, "Syntax: !unban <name/id>");
  1720. });
  1721. return;
  1722. }
  1723. string[] _param = param.Split(' ');
  1724. var plr = covalence.Players.FindPlayer(_param[0]);
  1725. if (plr == null)
  1726. {
  1727. GetChannel(Client, channelid, chan =>
  1728. {
  1729. chan.CreateMessage(Client, "Error: player not found");
  1730. });
  1731. return;
  1732. }
  1733. plr.Unban();
  1734. GetChannel(Client, channelid, chan =>
  1735. {
  1736. chan.CreateMessage(Client, "Success: Unban command executed!");
  1737. });
  1738. break;
  1739. }
  1740. case "com":
  1741. {
  1742. if (String.IsNullOrEmpty(param))
  1743. {
  1744. GetChannel(Client, channelid, chan =>
  1745. {
  1746. chan.CreateMessage(Client, "Syntax: !com <command>");
  1747. });
  1748. return;
  1749. }
  1750. string[] _param = param.Split(' ');
  1751. if (_param.Length > 1)
  1752. {
  1753. string[] args = new string[_param.Length - 1];
  1754. Array.Copy(_param, 1, args, 0, args.Length);
  1755. this.Server.Command(_param[0], args);
  1756. }
  1757. else
  1758. {
  1759. this.Server.Command(param);
  1760. }
  1761. GetChannel(Client, channelid, chan =>
  1762. {
  1763. chan.CreateMessage(Client, "Success: Console command executed!");
  1764. });
  1765. break;
  1766. }
  1767. case "mute":
  1768. {
  1769. if (BetterChatMute == null)
  1770. {
  1771. GetChannel(Client, channelid, chan =>
  1772. {
  1773. chan.CreateMessage(Client, "This command requires the Better Chat Mute plugin.");
  1774. return;
  1775. });
  1776. }
  1777. if (string.IsNullOrEmpty(param))
  1778. {
  1779. GetChannel(Client, channelid, chan =>
  1780. {
  1781. chan.CreateMessage(Client, "Syntax: !mute <playername/steamid> <time (optional)> <reason (optional)>");
  1782. });
  1783. return;
  1784. }
  1785. string[] _param = param.Split(' ');
  1786. if (_param.Length >= 1)
  1787. {
  1788. this.Server.Command($"mute {string.Join(" ", _param)}");
  1789. return;
  1790. }
  1791. GetChannel(Client, channelid, chan =>
  1792. {
  1793. chan.CreateMessage(Client, "Success: Mute command executed!");
  1794. });
  1795. break;
  1796. }
  1797. case "unmute":
  1798. {
  1799. if (BetterChatMute == null)
  1800. {
  1801. GetChannel(Client, channelid, chan =>
  1802. {
  1803. chan.CreateMessage(Client, "This command requires the Better Chat Mute plugin.");
  1804. return;
  1805. });
  1806. }
  1807. if (String.IsNullOrEmpty(param))
  1808. {
  1809. GetChannel(Client, channelid, chan =>
  1810. {
  1811. chan.CreateMessage(Client, "Syntax: !unmute <playername/steamid>");
  1812. });
  1813. return;
  1814. }
  1815. string[] _param = param.Split(' ');
  1816. if (_param.Length > 1)
  1817. {
  1818. GetChannel(Client, channelid, chan =>
  1819. {
  1820. chan.CreateMessage(Client, "Syntax: !unmute <playername/steamid>");
  1821. });
  1822. return;
  1823. }
  1824. if (_param.Length == 1)
  1825. {
  1826. this.Server.Command($"unmute {string.Join(" ", _param)}");
  1827. return;
  1828. }
  1829. break;
  1830. }
  1831. }
  1832.  
  1833. }
  1834. #endregion
  1835.  
  1836. #region Game Commands
  1837. // /report [message]
  1838. void cmdReport(BasePlayer player, string command, string[] args)
  1839. {
  1840. if (args.Length < 1)
  1841. {
  1842. SendReply(player, "Syntax: /report [message]");
  1843. return;
  1844. }
  1845.  
  1846. if (_settings.OutputFormat.OutputTypeReports == "Embed")
  1847. {
  1848. string message = string.Join(" ", args);
  1849. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  1850. .AddTitle("PLAYER REPORT")
  1851. .AddColor("#FF0000")
  1852. .AddThumbnail("https://i.imgur.com/qg7v0Tv.png")
  1853. .AddDescription($"{player.displayName} has submitted a report.")
  1854. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  1855. .AddNowTimestamp()
  1856. .AddField("Message", message, true);
  1857.  
  1858.  
  1859.  
  1860. for (int i = 0; i < _channelCount; i++)
  1861. {
  1862. if (_settings.Channels[i].perms.Contains("game_report"))
  1863. {
  1864. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  1865. {
  1866. chan.CreateMessage(Client, builder.Build());
  1867. });
  1868. }
  1869. }
  1870. }
  1871. if (_settings.OutputFormat.OutputTypeReports == "Simple")
  1872. {
  1873. string message = string.Join(" ", args);
  1874.  
  1875. var dict = new Dictionary<string, string>
  1876. {
  1877. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  1878. { "playername", player.displayName },
  1879. { "message", message }
  1880. };
  1881.  
  1882. for (int i = 0; i < _channelCount; i++)
  1883. {
  1884. if (_settings.Channels[i].perms.Contains("game_report"))
  1885. {
  1886. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  1887. {
  1888. chan.CreateMessage(Client, Translate("RUST_OnPlayerReport", dict));
  1889. });
  1890. }
  1891. }
  1892. }
  1893.  
  1894. SendReply(player, "Your report has been submitted to Discord.");
  1895.  
  1896. }
  1897.  
  1898. void cmdBug(BasePlayer player, string command, string[] args)
  1899. {
  1900. if (args.Length < 1)
  1901. {
  1902. SendReply(player, "Syntax: /bug [message]");
  1903. return;
  1904. }
  1905. if (_settings.OutputFormat.OutputTypeBugs == "Embed")
  1906. {
  1907. string message = string.Join(" ", args);
  1908. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  1909. .AddTitle("BUG REPORT")
  1910. .AddThumbnail("https://i.imgur.com/GLjfCFd.png")
  1911. .AddColor("#FF0000")
  1912. .AddDescription($"{player.displayName} has reported a bug.")
  1913. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  1914. .AddNowTimestamp()
  1915. .AddField("Bug", message, true);
  1916.  
  1917.  
  1918.  
  1919. for (int i = 0; i < _channelCount; i++)
  1920. {
  1921. if (_settings.Channels[i].perms.Contains("game_bug"))
  1922. {
  1923. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  1924. {
  1925. chan.CreateMessage(Client, builder.Build());
  1926. });
  1927. }
  1928. }
  1929. }
  1930. if (_settings.OutputFormat.OutputTypeBugs == "Simple")
  1931. {
  1932. string message = string.Join(" ", args);
  1933. for (int i = 0; i < _channelCount; i++)
  1934. {
  1935. if (_settings.Channels[i].perms.Contains("game_bug"))
  1936. {
  1937. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  1938. {
  1939. chan.CreateMessage(Client, Translate("RUST_OnPlayerBug", new Dictionary<string, string>
  1940. {
  1941. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  1942. { "playername", player.displayName },
  1943. { "message", message }
  1944. }));
  1945. });
  1946. }
  1947. }
  1948. }
  1949.  
  1950. SendReply(player, "Your bug report has been submitted to Discord.");
  1951.  
  1952. }
  1953. #endregion
  1954.  
  1955. #region Rust Logging
  1956.  
  1957. #region Chat Logging
  1958. private void OnPlayerChat(BasePlayer player, string message, ConVar.Chat.ChatChannel channel)
  1959. {
  1960. if (Client == null) return;
  1961. if (player == null || message == null) return;
  1962.  
  1963. //Added by Terceran on 9/6/2024 to address an exception when the API Key is messed up
  1964. if (channel == null) return;
  1965.  
  1966.  
  1967. if (permission.UserHasPermission(player.UserIDString, "rustcord.hidechat")) return;
  1968. if (BetterChatMute?.Call<bool>("API_IsMuted", player.IPlayer) ?? false) return;
  1969. if (_settings.Filters.FilterWords != null && _settings.Filters.FilterWords.Count > 0)
  1970. {
  1971. for (int i = _settings.Filters.FilterWords.Count - 1; i >= 0; i--)
  1972. {
  1973. while (message.Contains(" " + _settings.Filters.FilterWords[i] + " ") || message.Contains(_settings.Filters.FilterWords[i]))
  1974. message = message.Replace(_settings.Filters.FilterWords[i], _settings.Filters.FilteredWord ?? "");
  1975. }
  1976. }
  1977.  
  1978. var text = GetPlayerCache(player, message, CacheType.OnPlayerChat);
  1979.  
  1980. for (int i = 0; i < _settings.Channels.Count; i++)
  1981. {
  1982. if (_settings.Channels[i].perms.Contains(channel == ConVar.Chat.ChatChannel.Team ? "msg_teamchat" : "msg_chat"))
  1983. {
  1984. if (!(player.IsValid())) continue;
  1985.  
  1986. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  1987. {
  1988. chan.CreateMessage(Client, Translate(channel == ConVar.Chat.ChatChannel.Team ? "RUST_OnPlayerTeamChat" : "RUST_OnPlayerChat", text));
  1989.  
  1990. });
  1991. }
  1992. }
  1993.  
  1994. text.Clear();
  1995. }
  1996. #endregion
  1997.  
  1998. #region Crate Logging
  1999. void OnCrateDropped(HackableLockedCrate crate)
  2000. {
  2001. var dict = new Dictionary<string, string>
  2002. {
  2003. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  2004. };
  2005. for (int i = 0; i < _channelCount; i++)
  2006. {
  2007. if (_settings.Channels[i].perms.Contains("log_cratedrop"))
  2008. {
  2009. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2010. {
  2011. chan.CreateMessage(Client, Translate("RUST_OnCrateDropped", dict));
  2012. });
  2013. }
  2014. }
  2015. }
  2016.  
  2017. void OnSupplyDropLanded(SupplyDrop entity)
  2018. {
  2019. var dict = new Dictionary<string, string>
  2020. {
  2021. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  2022. };
  2023. for (int i = 0; i < _channelCount; i++)
  2024. {
  2025. if (_settings.Channels[i].perms.Contains("log_supplydrop"))
  2026. {
  2027. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2028. {
  2029. chan.CreateMessage(Client, Translate("RUST_OnSupplyDrop", dict));
  2030. });
  2031. }
  2032. }
  2033. }
  2034. #endregion
  2035.  
  2036. #region Death Logging
  2037. private void OnPlayerDeath(BasePlayer player, HitInfo info)
  2038. {
  2039. if (player == null) return;
  2040. if (info?.InitiatorPlayer == null) return;
  2041. if ((player.IsNpc) || (info.InitiatorPlayer.IsNpc)) return;
  2042.  
  2043. if (_settings.OutputFormat.OutputTypeDeaths == "Embed")
  2044. {
  2045. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  2046. .AddTitle("PLAYER DEATH")
  2047. .AddColor("#000000")
  2048. .AddThumbnail("https://i.imgur.com/UZZTf08.png")
  2049. .AddField("Victim", player.displayName, true)
  2050. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  2051. .AddNowTimestamp()
  2052. .AddField("Killer", info.InitiatorPlayer.displayName, true);
  2053.  
  2054. for (int i = 0; i < _channelCount; i++)
  2055. {
  2056. if (_settings.Channels[i].perms.Contains("log_deaths"))
  2057. {
  2058. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2059. {
  2060. chan.CreateMessage(Client, builder.Build());
  2061. });
  2062. }
  2063. }
  2064. }
  2065. if (_settings.OutputFormat.OutputTypeDeaths == "Simple")
  2066. {
  2067. var dict = new Dictionary<string, string>
  2068. {
  2069. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2070. { "victim", player.displayName },
  2071. { "killer", info.InitiatorPlayer.displayName }
  2072. };
  2073. for (int i = 0; i < _channelCount; i++)
  2074. {
  2075. if (_settings.Channels[i].perms.Contains("log_deaths"))
  2076. {
  2077. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2078. {
  2079. chan.CreateMessage(Client, Translate("RUST_OnPlayerDeath", dict));
  2080. });
  2081.  
  2082. }
  2083. }
  2084. }
  2085. }
  2086. #endregion
  2087.  
  2088. #region Group Logging
  2089. void OnGroupCreated(string name)
  2090. {
  2091. var dict = new Dictionary<string, string>
  2092. {
  2093. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2094. { "groupname", name }
  2095. };
  2096. for (int i = 0; i < _channelCount; i++)
  2097. {
  2098. if (_settings.Channels[i].perms.Contains("log_groups"))
  2099. {
  2100. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2101. {
  2102. chan.CreateMessage(Client, Translate("RUST_OnGroupCreated", dict));
  2103. });
  2104. }
  2105. }
  2106. }
  2107.  
  2108. void OnGroupDeleted(string name)
  2109. {
  2110. var dict = new Dictionary<string, string>
  2111. {
  2112. { "groupname", name }
  2113. };
  2114. for (int i = 0; i < _channelCount; i++)
  2115. {
  2116. if (_settings.Channels[i].perms.Contains("log_groups"))
  2117. {
  2118. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2119. {
  2120. chan.CreateMessage(Client, Translate("RUST_OnGroupDeleted", dict));
  2121. });
  2122. }
  2123. }
  2124. }
  2125.  
  2126.  
  2127.  
  2128. void OnUserGroupAdded(string id, string groupName)
  2129. {
  2130. if (_settings.Excluded.LogExcludeGroups.Contains(groupName)) { return; }
  2131. if (groupName == "default") return;
  2132. var player = covalence.Players.FindPlayerById(id);
  2133. if (player == null) return;
  2134. var dict = new Dictionary<string, string>
  2135. {
  2136. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2137. { "playername", player.Name },
  2138. { "playersteamid", id },
  2139. { "groupname", groupName }
  2140. };
  2141. for (int i = 0; i < _channelCount; i++)
  2142. {
  2143. if (_settings.Channels[i].perms.Contains("log_groups"))
  2144. {
  2145. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2146. {
  2147. chan.CreateMessage(Client, Translate("RUST_OnUserGroupAdded", dict));
  2148. });
  2149. }
  2150. }
  2151. }
  2152.  
  2153. void OnUserGroupRemoved(string id, string groupName)
  2154. {
  2155. if (_settings.Excluded.LogExcludeGroups.Contains(groupName)) return;
  2156. if (groupName == "default") return;
  2157. var player = covalence.Players.FindPlayerById(id);
  2158. if (player == null) return;
  2159. var dict = new Dictionary<string, string>
  2160. {
  2161. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2162. { "playername", player.Name },
  2163. { "playersteamid", id },
  2164. { "groupname", groupName }
  2165. };
  2166. for (int i = 0; i < _channelCount; i++)
  2167. {
  2168. if (_settings.Channels[i].perms.Contains("log_groups"))
  2169. {
  2170. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2171. {
  2172. chan.CreateMessage(Client, Translate("RUST_OnUserGroupRemoved", dict));
  2173. });
  2174. }
  2175. }
  2176. }
  2177. #endregion
  2178.  
  2179. #region Join & Quit Logging
  2180. private void OnPlayerConnected(BasePlayer player)
  2181. {
  2182. if (Client == null) return;
  2183. if (player == null) return;
  2184. if (!player.IsValid()) return;
  2185.  
  2186. HandleAdminJoin(player);
  2187. HandlePlayerJoin(player);
  2188. }
  2189.  
  2190. private void HandleAdminJoin(BasePlayer player)
  2191. {
  2192. if (_settings.OutputFormat.OutputTypeJoinAdminChan == "Simple")
  2193. {
  2194. var text = GetPlayerCache(player, player.net.connection.ipaddress, CacheType.OnPlayerConnected);
  2195.  
  2196. for (int i = 0; i < _channelCount; i++)
  2197. {
  2198. if (_settings.Channels[i].perms.Contains("msg_joinlog"))
  2199. {
  2200. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2201. {
  2202. // Admin
  2203. chan.CreateMessage(Client, Translate("RUST_OnPlayerJoinAdminLog", text));
  2204. });
  2205. }
  2206. }
  2207. }
  2208. if (_settings.OutputFormat.OutputTypeJoinAdminChan == "Embed")
  2209. {
  2210. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  2211. .AddTitle("PLAYER INFO")
  2212. .AddColor("#00FF00")
  2213. .AddThumbnail("https://i.imgur.com/AfbPIrb.png")
  2214. .AddField("Name", player.displayName, true)
  2215. .AddField("IP", player.net.connection.ipaddress.Split(':')[0], true)
  2216. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  2217. .AddNowTimestamp()
  2218. .AddField("Steam ID", GetFormattedSteamID(player.UserIDString), true);
  2219.  
  2220.  
  2221.  
  2222. for (int i = 0; i < _channelCount; i++)
  2223. {
  2224. if (_settings.Channels[i].perms.Contains("msg_joinlog"))
  2225. {
  2226. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2227. {
  2228. chan.CreateMessage(Client, builder.Build());
  2229. });
  2230. }
  2231. }
  2232. }
  2233. }
  2234.  
  2235. private void HandlePlayerJoin(BasePlayer player)
  2236. {
  2237. if (permission.UserHasPermission(player.UserIDString, "rustcord.hidejoinquit")) return;
  2238.  
  2239. if (_settings.OutputFormat.OutputTypeJoinQuit == "Simple")
  2240. {
  2241. var text = GetPlayerCache(player, null, CacheType.OnPlayerJoin);
  2242.  
  2243. for (int i = 0; i < _channelCount; i++)
  2244. {
  2245. if (_settings.Channels[i].perms.Contains("msg_join"))
  2246. {
  2247. GetChannel(Client, _settings.Channels[i].Channelid, chan => { chan.CreateMessage(Client, Translate("RUST_OnPlayerJoin", text)); });
  2248. }
  2249. }
  2250. }
  2251. if (_settings.OutputFormat.OutputTypeJoinQuit == "Embed")
  2252. {
  2253. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  2254. .AddTitle("PLAYER JOIN")
  2255. .AddColor("#00FF00")
  2256. .AddThumbnail("https://i.imgur.com/hQK7Jjv.png")
  2257. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  2258. .AddNowTimestamp()
  2259. .AddDescription($"{player.displayName} has joined the server.");
  2260.  
  2261.  
  2262.  
  2263. for (int i = 0; i < _channelCount; i++)
  2264. {
  2265. if (_settings.Channels[i].perms.Contains("msg_join"))
  2266. {
  2267. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2268. {
  2269. chan.CreateMessage(Client, builder.Build());
  2270. });
  2271. }
  2272. }
  2273. }
  2274. }
  2275.  
  2276. private void OnPlayerDisconnected(BasePlayer player, string reason)
  2277. {
  2278. if (Client == null) return;
  2279. if (player == null || string.IsNullOrEmpty(reason)) return;
  2280. if (permission.UserHasPermission(player.UserIDString, "rustcord.hidejoinquit"))
  2281. return;
  2282. if (_settings.OutputFormat.OutputTypeJoinQuit == "Simple")
  2283. {
  2284. var text = GetPlayerCache(player, reason, CacheType.OnPlayerDisconnected);
  2285.  
  2286. for (int i = 0; i < _channelCount; i++)
  2287. {
  2288. if (_settings.Channels[i].perms.Contains("msg_quit"))
  2289. {
  2290. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2291. {
  2292. chan.CreateMessage(Client, Translate("RUST_OnPlayerQuit", text));
  2293. });
  2294. }
  2295. }
  2296.  
  2297. cache[CacheType.OnPlayerChat].Remove(player);
  2298. cache[CacheType.OnPlayerConnected].Remove(player);
  2299. cache[CacheType.OnPlayerDisconnected].Remove(player);
  2300. cache[CacheType.OnPlayerJoin].Remove(player);
  2301. }
  2302. if (_settings.OutputFormat.OutputTypeJoinQuit == "Embed")
  2303. {
  2304. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  2305. .AddTitle("PLAYER QUIT")
  2306. .AddColor("#00FF00")
  2307. .AddThumbnail("https://i.imgur.com/py6bHm0.png")
  2308. .AddDescription($"{player.displayName} has left the server.")
  2309. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  2310. .AddNowTimestamp()
  2311. .AddField("Reason", reason, true);
  2312.  
  2313.  
  2314.  
  2315. for (int i = 0; i < _channelCount; i++)
  2316. {
  2317. if (_settings.Channels[i].perms.Contains("msg_quit"))
  2318. {
  2319. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2320. {
  2321. chan.CreateMessage(Client, builder.Build());
  2322. });
  2323. }
  2324. }
  2325. }
  2326. }
  2327. #endregion
  2328.  
  2329. #region Permission Logging
  2330. void OnUserPermissionGranted(string id, string permName)
  2331. {
  2332. if (_settings.Excluded.LogExcludePerms.Contains(permName)) return;
  2333. var player = covalence.Players.FindPlayerById(id);
  2334. if (player == null) return;
  2335. var dict = new Dictionary<string, string>
  2336. {
  2337. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2338. { "playername", player.Name },
  2339. { "playersteamid", id },
  2340. { "permission", permName }
  2341. };
  2342. for (int i = 0; i < _channelCount; i++)
  2343. {
  2344. if (_settings.Channels[i].perms.Contains("log_perms"))
  2345. {
  2346. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2347. {
  2348. chan.CreateMessage(Client, Translate("RUST_OnUserPermissionGranted", dict));
  2349. });
  2350. }
  2351. }
  2352. }
  2353.  
  2354. void OnGroupPermissionGranted(string name, string perm)
  2355. {
  2356. if (_settings.Excluded.LogExcludePerms.Contains(perm)) return;
  2357. var dict = new Dictionary<string, string>
  2358. {
  2359. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2360. { "groupname", name },
  2361. { "permission", perm }
  2362. };
  2363. for (int i = 0; i < _channelCount; i++)
  2364. {
  2365. if (_settings.Channels[i].perms.Contains("log_perms"))
  2366. {
  2367. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2368. {
  2369. chan.CreateMessage(Client, Translate("RUST_OnGroupPermissionGranted", dict));
  2370. });
  2371. }
  2372. }
  2373. }
  2374.  
  2375. void OnUserPermissionRevoked(string id, string permName)
  2376. {
  2377. if (_settings.Excluded.LogExcludePerms.Contains(permName)) return;
  2378. var player = covalence.Players.FindPlayerById(id);
  2379. if (player == null) return;
  2380. var dict = new Dictionary<string, string>
  2381. {
  2382. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2383. { "playername", player.Name },
  2384. { "playersteamid", id },
  2385. { "permission", permName }
  2386. };
  2387. for (int i = 0; i < _channelCount; i++)
  2388. {
  2389. if (_settings.Channels[i].perms.Contains("log_perms"))
  2390. {
  2391. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2392. {
  2393. chan.CreateMessage(Client, Translate("RUST_OnUserPermissionRevoked", dict));
  2394. });
  2395. }
  2396. }
  2397. }
  2398.  
  2399. void OnGroupPermissionRevoked(string name, string perm)
  2400. {
  2401. if (_settings.Excluded.LogExcludePerms.Contains(perm)) return;
  2402. var dict = new Dictionary<string, string>
  2403. {
  2404. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2405. { "groupname", name },
  2406. { "permission", perm }
  2407. };
  2408. for (int i = 0; i < _channelCount; i++)
  2409. {
  2410. if (_settings.Channels[i].perms.Contains("log_perms"))
  2411. {
  2412. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2413. {
  2414. chan.CreateMessage(Client, Translate("RUST_OnGroupPermissionRevoked", dict));
  2415. });
  2416. }
  2417. }
  2418. }
  2419. #endregion
  2420.  
  2421. #region Kick & Ban Logging
  2422. void OnUserKicked(IPlayer player, string reason)
  2423. {
  2424. if (_settings.OutputFormat.OutputTypeKicks == "Simple")
  2425. {
  2426. var dict = new Dictionary<string, string>
  2427. {
  2428. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2429. { "playername", player.Name },
  2430. { "reason", reason }
  2431. };
  2432. for (int i = 0; i < _channelCount; i++)
  2433. {
  2434. if (_settings.Channels[i].perms.Contains("log_kicks"))
  2435. {
  2436. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2437. {
  2438. chan.CreateMessage(Client, Translate("RUST_OnPlayerKicked", dict));
  2439. });
  2440. }
  2441. }
  2442. }
  2443. if (_settings.OutputFormat.OutputTypeKicks == "Embed")
  2444. {
  2445. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  2446. .AddTitle("PLAYER KICKED")
  2447. .AddThumbnail("https://i.imgur.com/ekF9ClZ.png")
  2448. .AddField("Name", player.Name, true)
  2449. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  2450. .AddNowTimestamp()
  2451. .AddField("Reason", reason, true);
  2452.  
  2453. for (int i = 0; i < _channelCount; i++)
  2454. {
  2455. if (_settings.Channels[i].perms.Contains("log_kicks"))
  2456. {
  2457. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2458. {
  2459. chan.CreateMessage(Client, builder.Build());
  2460. });
  2461. }
  2462. }
  2463. }
  2464. }
  2465.  
  2466. void OnUserBanned(string name, string bannedId, string address, string reason)
  2467. {
  2468. if (_settings.OutputFormat.OutputTypeBans == "Simple")
  2469. {
  2470. var dict = new Dictionary<string, string>
  2471. {
  2472. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2473. { "playername", name },
  2474. { "playersteamid", bannedId },
  2475. { "playerip", address },
  2476. { "reason", reason }
  2477. };
  2478. for (int i = 0; i < _channelCount; i++)
  2479. {
  2480. if (_settings.Channels[i].perms.Contains("log_bans"))
  2481. {
  2482. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2483. {
  2484. chan.CreateMessage(Client, Translate("RUST_OnPlayerBanned", dict));
  2485. });
  2486. }
  2487. }
  2488. }
  2489. if (_settings.OutputFormat.OutputTypeBans == "Embed")
  2490. {
  2491. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  2492. .AddTitle("PLAYER BANNED")
  2493. .AddThumbnail("https://i.imgur.com/ekF9ClZ.png")
  2494. .AddField("Name", name, true)
  2495. .AddField("IP", address, true)
  2496. .AddField("Steam ID", GetFormattedSteamID(bannedId), true)
  2497. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  2498. .AddNowTimestamp()
  2499. .AddField("Ban Reason", reason, false);
  2500.  
  2501. for (int i = 0; i < _channelCount; i++)
  2502. {
  2503. if (_settings.Channels[i].perms.Contains("log_bans"))
  2504. {
  2505. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2506. {
  2507. chan.CreateMessage(Client, builder.Build());
  2508. });
  2509. }
  2510. }
  2511. }
  2512.  
  2513. }
  2514.  
  2515. private void OnUserUnbanned(string name, string id, string ip)
  2516. {
  2517. if (_settings.OutputFormat.OutputTypeBans == "Simple")
  2518. {
  2519. var dict = new Dictionary<string, string>
  2520. {
  2521. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2522. { "playername", name },
  2523. { "playersteamid", id },
  2524. { "playerip", ip }
  2525. };
  2526. for (int i = 0; i < _channelCount; i++)
  2527. {
  2528. if (_settings.Channels[i].perms.Contains("log_bans"))
  2529. {
  2530. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2531. {
  2532. chan.CreateMessage(Client, Translate("RUST_OnPlayerUnBanned", dict));
  2533. });
  2534. }
  2535. }
  2536. }
  2537. if (_settings.OutputFormat.OutputTypeBans == "Embed")
  2538. {
  2539. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  2540. .AddTitle("PLAYER UNBANNED")
  2541. .AddThumbnail("https://i.imgur.com/ekF9ClZ.png")
  2542. .AddField("Name", name, true)
  2543. .AddField("IP", ip, true)
  2544. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  2545. .AddNowTimestamp()
  2546. .AddField("Steam ID", GetFormattedSteamID(id), true);
  2547.  
  2548. for (int i = 0; i < _channelCount; i++)
  2549. {
  2550. if (_settings.Channels[i].perms.Contains("log_bans"))
  2551. {
  2552. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2553. {
  2554. chan.CreateMessage(Client, builder.Build());
  2555. });
  2556. }
  2557. }
  2558. }
  2559. }
  2560. #endregion
  2561.  
  2562. #region Player Name Change Logging
  2563. void OnUserNameUpdated(string id, string oldName, string newName) //TESTING FUNCTION
  2564. {
  2565.  
  2566. if ((oldName == newName) || (oldName == "Unnamed")) return;
  2567. if (_settings.OutputFormat.OutputTypeNameChange == "Embed")
  2568. {
  2569. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  2570. .AddTitle("PLAYER NAME CHANGE")
  2571. .AddThumbnail("https://i.imgur.com/Fq4LvFz.png")
  2572. .AddField("Old Name", oldName, true)
  2573. .AddField("New Name", newName, true)
  2574. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  2575. .AddNowTimestamp()
  2576. .AddField("Steam ID", GetFormattedSteamID(id), false);
  2577.  
  2578. for (int i = 0; i < _channelCount; i++)
  2579. {
  2580. if (_settings.Channels[i].perms.Contains("log_namechange"))
  2581. {
  2582. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2583. {
  2584. chan.CreateMessage(Client, builder.Build());
  2585. });
  2586. }
  2587. }
  2588. }
  2589. if (_settings.OutputFormat.OutputTypeNameChange == "Simple")
  2590. {
  2591. var dict = new Dictionary<string, string>
  2592. {
  2593. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2594. { "oldname", oldName },
  2595. { "newname", newName },
  2596. { "playersteamid", id }
  2597. };
  2598. for (int i = 0; i < _channelCount; i++)
  2599. {
  2600. if (_settings.Channels[i].perms.Contains("log_namechange"))
  2601. {
  2602. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2603. {
  2604. chan.CreateMessage(Client, Translate("RUST_OnPlayerNameChange", dict));
  2605. });
  2606. }
  2607. }
  2608. }
  2609.  
  2610. }
  2611. #endregion
  2612.  
  2613. #region Server Init/Shutdown Logging
  2614. private void OnServerInitialized(bool isStartup)
  2615. {
  2616. var reloadtime = _settings.General.AutoReloadTime;
  2617.  
  2618. permission.RegisterPermission("rustcord.hidejoinquit", this);
  2619. permission.RegisterPermission("rustcord.hidechat", this);
  2620.  
  2621. if (_settings.General.AutoReloadPlugin && _settings.General.AutoReloadTime > 59)
  2622. {
  2623. timer.Every(reloadtime, () => Reload());
  2624. }
  2625.  
  2626. if (Client != null && isStartup)
  2627. {
  2628. for (int i = 0; i < _channelCount; i++)
  2629. {
  2630. if (_settings.Channels[i].perms.Contains("msg_serverinit"))
  2631. {
  2632. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2633. {
  2634. chan.CreateMessage(Client, Translate("RUST_OnInitMsg"));
  2635. });
  2636. }
  2637. }
  2638. }
  2639. }
  2640. void OnServerShutdown()
  2641. {
  2642.  
  2643. for (int i = 0; i < _channelCount; i++)
  2644. {
  2645. if (_settings.Channels[i].perms.Contains("msg_serverinit"))
  2646. {
  2647. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2648. {
  2649. chan.CreateMessage(Client, Translate("RUST_OnServerShutdown"));
  2650. });
  2651. }
  2652. }
  2653. }
  2654. #endregion
  2655.  
  2656. #region Server Message Logging (F1 Spawns)
  2657. private object OnServerMessage(string message, string name)
  2658. {
  2659. if (message.Contains("gave") && name == "SERVER")
  2660. {
  2661. var dict = new Dictionary<string, string>
  2662. {
  2663. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2664. { "playername", name },
  2665. { "givemessage", message }
  2666. };
  2667. for (int i = 0; i < _channelCount; i++)
  2668. {
  2669. if (_settings.Channels[i].perms.Contains("log_admingive"))
  2670. {
  2671. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2672. {
  2673. chan.CreateMessage(Client, Translate("RUST_OnF1ItemSpawn", dict));
  2674. });
  2675. }
  2676. }
  2677. }
  2678.  
  2679. return null;
  2680. }
  2681. #endregion
  2682.  
  2683. #region Server Wipe Logging
  2684. private void OnNewSave(string filename)
  2685. {
  2686. var mapseed = ConVar.Server.seed.ToString();
  2687. var servername = ConVar.Server.hostname;
  2688. var serverip = covalence.Server.Address.ToString();
  2689. var serverport = covalence.Server.Port.ToString();
  2690. var serverworldsize = ConVar.Server.worldsize.ToString();
  2691.  
  2692. if (_settings.OutputFormat.OutputTypeServerWipe == "Simple")
  2693. {
  2694. var dict = new Dictionary<string, string>
  2695. {
  2696. { "mapseed", mapseed },
  2697. { "servername", servername },
  2698. { "serverip", serverip },
  2699. { "serverport", serverport },
  2700. { "serverworldsize", serverworldsize }
  2701. };
  2702. for (int i = 0; i < _channelCount; i++)
  2703. {
  2704. if (_settings.Channels[i].perms.Contains("log_serverwipe"))
  2705. {
  2706. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2707. {
  2708. chan.CreateMessage(Client, Translate("RUST_OnServerWipe", dict));
  2709. });
  2710. }
  2711. }
  2712. }
  2713. if (_settings.OutputFormat.OutputTypeServerWipe == "Embed")
  2714. {
  2715. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  2716. .AddTitle("SERVER HAS WIPED")
  2717. .AddThumbnail("https://i.imgur.com/EODRYQQ.png")
  2718. .AddDescription(servername)
  2719. .AddField("Map Seed", mapseed, true)
  2720. .AddField("World Size", serverworldsize, true)
  2721. .AddField("Server IP", serverip, false)
  2722. .AddField("Server Port", serverport, true)
  2723. .AddField("Quick Join:", $"steam://connect/{serverip}:{serverport}", false)
  2724. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  2725. .AddNowTimestamp();
  2726.  
  2727. for (int i = 0; i < _channelCount; i++)
  2728. {
  2729. if (_settings.Channels[i].perms.Contains("log_serverwipe"))
  2730. {
  2731. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2732. {
  2733. chan.CreateMessage(Client, builder.Build());
  2734. });
  2735. }
  2736. }
  2737. }
  2738. }
  2739. #endregion
  2740.  
  2741. #region Server Command Logging (Note/Gestures)
  2742. private void OnServerCommand(ConsoleSystem.Arg arg)
  2743. {
  2744. var player1 = arg.Player();
  2745. var emote = arg.GetString(0);
  2746.  
  2747. if (arg.cmd.Name == "gesture")
  2748. {
  2749. if (_emotes.ContainsKey(emote))
  2750. {
  2751. var emoji = _emotes[emote];
  2752. var dict = new Dictionary<string, string>
  2753. {
  2754. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2755. {"playername", player1.displayName },
  2756. {"gesture", emoji }
  2757. };
  2758. for (int i = 0; i < _channelCount; i++)
  2759. {
  2760. if (_settings.Channels[i].perms.Contains("msg_gestures"))
  2761. {
  2762. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2763. {
  2764. chan.CreateMessage(Client, Translate("RUST_OnPlayerGesture", dict));
  2765. });
  2766. }
  2767. }
  2768. }
  2769. }
  2770. if (arg.cmd.FullName == "note.update")
  2771. {
  2772. BasePlayer player = arg.Connection.player as BasePlayer;
  2773. if (player == null)
  2774. return;
  2775. var notemsg = arg.GetString(1, string.Empty);
  2776. if (string.IsNullOrEmpty(notemsg)) return;
  2777.  
  2778. if (_settings.OutputFormat.OutputTypeNoteLog == "Simple")
  2779. {
  2780. var dict = new Dictionary<string, string>
  2781. {
  2782. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2783. { "playername", player.displayName },
  2784. { "notemessage", notemsg }
  2785. };
  2786. for (int i = 0; i < _channelCount; i++)
  2787. {
  2788. if (_settings.Channels[i].perms.Contains("log_itemnote"))
  2789. {
  2790. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2791. {
  2792. chan.CreateMessage(Client, Translate("RUST_OnNoteUpdate", dict));
  2793. });
  2794. }
  2795. }
  2796. }
  2797. if (_settings.OutputFormat.OutputTypeNoteLog == "Embed")
  2798. {
  2799. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  2800. .AddTitle("NOTE UPDATE")
  2801. .AddThumbnail("https://i.imgur.com/AZvqSSf.png")
  2802. .AddField("Author", player.displayName, false)
  2803. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  2804. .AddNowTimestamp()
  2805. .AddField("Message", notemsg, false);
  2806.  
  2807. for (int i = 0; i < _channelCount; i++)
  2808. {
  2809. if (_settings.Channels[i].perms.Contains("log_itemnote"))
  2810. {
  2811. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2812. {
  2813. chan.CreateMessage(Client, builder.Build());
  2814. });
  2815. }
  2816. }
  2817. }
  2818. }
  2819. }
  2820. private readonly Dictionary<string, string> _emotes = new Dictionary<string, string>
  2821. {
  2822. ["wave"] = ":wave:",
  2823. ["shrug"] = ":shrug:",
  2824. ["victory"] = ":trophy:",
  2825. ["thumbsup"] = ":thumbsup:",
  2826. ["chicken"] = ":chicken:",
  2827. ["hurry"] = ":runner:",
  2828. ["whoa"] = ":flag_white:"
  2829. };
  2830. #endregion
  2831.  
  2832. #region F7 Report Logging
  2833. void OnPlayerReported(BasePlayer reporter, string targetName, string targetId, string subject, string message, string type)
  2834. {
  2835. if (reporter == null || message == null || targetName == null || targetId == null || subject == null || type == null) return;
  2836. if (_settings.OutputFormat.OutputTypeF7Report == "Embed")
  2837. {
  2838. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  2839. .AddTitle("PLAYER F7 REPORT")
  2840. .AddThumbnail("https://i.imgur.com/qg7v0Tv.png")
  2841. .AddField("Reporter", reporter.displayName, false)
  2842. .AddField("User Reported", $"{targetName} ([{targetId}](https://steamcommunity.com/profiles/{targetId})", false)
  2843. .AddField("Reason", subject, false)
  2844. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  2845. .AddNowTimestamp()
  2846. .AddField("Message", message, false);
  2847.  
  2848. for (int i = 0; i < _channelCount; i++)
  2849. {
  2850. if (_settings.Channels[i].perms.Contains("log_f7reports"))
  2851. {
  2852. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2853. {
  2854. chan.CreateMessage(Client, builder.Build());
  2855. });
  2856. }
  2857. }
  2858. }
  2859. if (_settings.OutputFormat.OutputTypeF7Report == "Simple")
  2860. {
  2861. var dict = new Dictionary<string, string>
  2862. {
  2863. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2864. { "reporter", reporter.displayName },
  2865. { "targetname", targetName },
  2866. { "targetsteamid", targetId },
  2867. { "reason", subject },
  2868. { "message", message }
  2869. };
  2870. for (int i = 0; i < _channelCount; i++)
  2871. {
  2872. if (_settings.Channels[i].perms.Contains("log_f7reports"))
  2873. {
  2874. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2875. {
  2876. chan.CreateMessage(Client, Translate("RUST_OnPlayerReported", dict));
  2877. });
  2878. }
  2879. }
  2880. }
  2881.  
  2882. }
  2883. #endregion
  2884.  
  2885. #region Custom Logging
  2886. private void ConsoleLog(string condition, string stackTrace, LogType type)
  2887. {
  2888. if (string.IsNullOrEmpty(condition))
  2889. {
  2890. return;
  2891. }
  2892. var dict = new Dictionary<string, string>
  2893. {
  2894. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2895. { "logtext", condition }
  2896. };
  2897. for (int i = 0; i < _channelCount; i++)
  2898. {
  2899. Settings.Channel channel = _settings.Channels[i];
  2900. if (channel.CustomFilter.Any(c => condition.Contains(c)))
  2901. {
  2902. string log = Translate("RUST_CustomLog", dict);
  2903. if (channel.FilterBuilder.Length + log.Length > 2000)
  2904. {
  2905. string message = channel.FilterBuilder.ToString();
  2906. GetChannel(Client, channel.Channelid, chan =>
  2907. {
  2908. chan.CreateMessage(Client, message);
  2909. });
  2910. channel.FilterBuilder.Clear();
  2911. channel.Timer?.Destroy();
  2912. channel.Timer = null;
  2913. }
  2914.  
  2915. channel.FilterBuilder.AppendLine(log);
  2916. if (channel.Timer == null)
  2917. {
  2918. channel.Timer = timer.In(5f, () =>
  2919. {
  2920. channel.Timer = null;
  2921. string message = channel.FilterBuilder.ToString();
  2922. GetChannel(Client, channel.Channelid, chan =>
  2923. {
  2924. chan.CreateMessage(Client, message);
  2925. });
  2926. channel.FilterBuilder.Clear();
  2927. });
  2928. }
  2929. }
  2930. }
  2931. }
  2932. #endregion
  2933.  
  2934. #region RCON Logging
  2935. private void OnRconConnection(IPAddress ip)
  2936. {
  2937. var dict = new Dictionary<string, string>
  2938. {
  2939. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2940. { "ip", ip.ToString() }
  2941. };
  2942. for (int i = 0; i < _channelCount; i++)
  2943. {
  2944. if (_settings.Channels[i].perms.Contains("log_rcon"))
  2945. {
  2946. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2947. {
  2948. chan.CreateMessage(Client, Translate("RUST_OnRCONConnected", dict));
  2949. });
  2950. }
  2951. }
  2952. }
  2953. #endregion
  2954.  
  2955. #region Spectate Logging
  2956. private void OnPlayerSpectate(BasePlayer player, string spectateFilter)
  2957. {
  2958. var dict = new Dictionary<string, string>
  2959. {
  2960. { "playername", player.displayName },
  2961. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  2962. { "targetname", spectateFilter }
  2963. };
  2964. for (int i = 0; i < _channelCount; i++)
  2965. {
  2966. if (_settings.Channels[i].perms.Contains("log_spectates"))
  2967. {
  2968. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2969. {
  2970. chan.CreateMessage(Client, Translate("RUST_OnPlayerSpectate", dict));
  2971. });
  2972.  
  2973. }
  2974. }
  2975. }
  2976. private void OnPlayerSpectateEnd(BasePlayer player, string spectateFilter)
  2977. {
  2978. var dict = new Dictionary<string, string>
  2979. {
  2980. { "playername", player.displayName },
  2981. { "targetname", spectateFilter }
  2982. };
  2983. for (int i = 0; i < _channelCount; i++)
  2984. {
  2985. if (_settings.Channels[i].perms.Contains("log_spectates"))
  2986. {
  2987. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  2988. {
  2989. chan.CreateMessage(Client, Translate("RUST_OnPlayerSpectateEnd", dict));
  2990. });
  2991. }
  2992. }
  2993. }
  2994. #endregion
  2995.  
  2996. #region SignShit
  2997.  
  2998. /*private void OnSignUpdated(Signage sign, BasePlayer player, int textureIndex)
  2999. {
  3000. using (Image image = Image.FromStream(new MemoryStream(FileStorage.server.Get(sign.textureIDs[textureIndex], FileStorage.Type.png, sign.net.ID, (uint)0))))
  3001. {
  3002. image.Save($"{sign.net.ID}.png");
  3003. }
  3004. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3005. .AddTitle("Sign Update")
  3006. .AddColor("#800080")
  3007. .AddDescription($"{player.displayName} has updated a sign.")
  3008. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  3009. .AddNowTimestamp()
  3010. .AddImage($"{sign.net.ID}.png")
  3011. .AddThumbnail("https://i.imgur.com/qkI2B4l.png");
  3012.  
  3013. for (int i = 0; i < _channelCount; i++)
  3014. {
  3015. if (_settings.Channels[i].perms.Contains("log_signs"))
  3016. {
  3017. GetChannel(_client, _settings.Channels[i].Channelid, chan =>
  3018. {
  3019. chan.CreateMessage(_client, builder.Build());
  3020. });
  3021. }
  3022. }
  3023. }*/
  3024. #endregion
  3025.  
  3026. #region Team Logging
  3027. void OnTeamCreated(BasePlayer player, RelationshipManager.PlayerTeam team)
  3028. {
  3029. if (_settings.OutputFormat.OutputTypeTeams == "Embed")
  3030. {
  3031. string leaderName = covalence.Players.FindPlayerById(team.teamLeader.ToString())?.Name;
  3032.  
  3033. List<string> players = new List<string>();
  3034. foreach (ulong member in team.members)
  3035. {
  3036. IPlayer memberPlayer = covalence.Players.FindPlayerById(member.ToString());
  3037. if (memberPlayer != null)
  3038. {
  3039. players.Add(GetPlayerFormattedField(memberPlayer));
  3040. }
  3041. else
  3042. {
  3043. players.Add(member.ToString());
  3044. }
  3045. }
  3046.  
  3047. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3048. .AddTitle("NEW TEAM CREATED")
  3049. .AddThumbnail("https://i.imgur.com/ChdmYGD.png")
  3050. .AddColor("#800080")
  3051. .AddField("Team ID", team.teamID.ToString(), true)
  3052. .AddField("Leader", leaderName, true)
  3053. .AddField("Members", string.Join("\n", players), false)
  3054. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  3055. .AddNowTimestamp();
  3056.  
  3057.  
  3058.  
  3059. for (int i = 0; i < _channelCount; i++)
  3060. {
  3061. if (_settings.Channels[i].perms.Contains("log_teams"))
  3062. {
  3063. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3064. {
  3065. chan.CreateMessage(Client, builder.Build());
  3066. });
  3067. }
  3068. }
  3069. }
  3070. if (_settings.OutputFormat.OutputTypeTeams == "Simple")
  3071. {
  3072. var dict = new Dictionary<string, string>
  3073. {
  3074. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  3075. { "playername", player.displayName },
  3076. { "teamid", team.teamID.ToString() }
  3077. };
  3078. for (int i = 0; i < _channelCount; i++)
  3079. {
  3080. if (_settings.Channels[i].perms.Contains("log_teams"))
  3081. {
  3082. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3083. {
  3084. chan.CreateMessage(Client, Translate("RUST_OnTeamCreated", dict));
  3085. });
  3086. }
  3087. }
  3088. }
  3089.  
  3090. }
  3091. void OnTeamAcceptInvite(RelationshipManager.PlayerTeam team, BasePlayer player)
  3092. {
  3093. if (_settings.OutputFormat.OutputTypeTeams == "Embed")
  3094. {
  3095. NextTick(() =>
  3096. {
  3097. string leaderName = covalence.Players.FindPlayerById(team.teamLeader.ToString())?.Name;
  3098.  
  3099. List<string> players = new List<string>();
  3100. foreach (ulong member in team.members)
  3101. {
  3102. IPlayer memberPlayer = covalence.Players.FindPlayerById(member.ToString());
  3103. if (memberPlayer != null)
  3104. {
  3105. players.Add(GetPlayerFormattedField(memberPlayer));
  3106. }
  3107. else
  3108. {
  3109. players.Add(member.ToString());
  3110. }
  3111. }
  3112.  
  3113. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3114. .AddTitle("TEAM JOIN")
  3115. .AddColor("#00FF00")
  3116. .AddThumbnail("https://i.imgur.com/nV7KfWf.png")
  3117. .AddDescription($"{player.displayName} has joined {leaderName}'s team.")
  3118. .AddField("Team ID", team.teamID.ToString(), true)
  3119. .AddField("Team Leader", leaderName, true)
  3120. .AddField("Team Members", string.Join("\n", players), false)
  3121. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  3122. .AddNowTimestamp();
  3123.  
  3124.  
  3125.  
  3126. for (int i = 0; i < _channelCount; i++)
  3127. {
  3128. if (_settings.Channels[i].perms.Contains("log_teams"))
  3129. {
  3130. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3131. {
  3132. chan.CreateMessage(Client, builder.Build());
  3133. });
  3134. }
  3135. }
  3136. });
  3137. }
  3138. if (_settings.OutputFormat.OutputTypeTeams == "Simple")
  3139. {
  3140. var dict = new Dictionary<string, string>
  3141. {
  3142. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  3143. { "playername", player.displayName },
  3144. { "teamleader", team.GetLeader().displayName },
  3145. { "teamid", team.teamID.ToString() }
  3146. };
  3147. for (int i = 0; i < _channelCount; i++)
  3148. {
  3149. if (_settings.Channels[i].perms.Contains("log_teams"))
  3150. {
  3151. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3152. {
  3153. chan.CreateMessage(Client, Translate("RUST_OnTeamAcceptInvite", dict));
  3154. });
  3155. }
  3156. }
  3157. }
  3158. }
  3159.  
  3160. void OnTeamLeave(RelationshipManager.PlayerTeam team, BasePlayer player)
  3161. {
  3162. if (team == null || player == null) return;
  3163. if (_settings.OutputFormat.OutputTypeTeams == "Embed")
  3164. {
  3165. string leaderName = covalence.Players.FindPlayerById(team.teamLeader.ToString())?.Name;
  3166. if (player.displayName == team.GetLeader().displayName) return;
  3167. List<string> players = new List<string>();
  3168. foreach (ulong member in team.members)
  3169. {
  3170. IPlayer memberPlayer = covalence.Players.FindPlayerById(member.ToString());
  3171. if (memberPlayer != null)
  3172. {
  3173. players.Add(GetPlayerFormattedField(memberPlayer));
  3174. }
  3175. else
  3176. {
  3177. players.Add(member.ToString());
  3178. }
  3179. }
  3180.  
  3181. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3182. .AddTitle("TEAM PART")
  3183. .AddColor("#FFA500")
  3184. .AddThumbnail("https://i.imgur.com/92y7DWt.png")
  3185. .AddDescription($"{player.displayName} left {leaderName}'s team.")
  3186. .AddField("Team ID", team.teamID.ToString(), true)
  3187. .AddField("Team Leader", leaderName, true)
  3188. .AddField("Team Members", string.Join("\n", players), false)
  3189. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  3190. .AddNowTimestamp();
  3191.  
  3192.  
  3193.  
  3194. for (int i = 0; i < _channelCount; i++)
  3195. {
  3196. if (_settings.Channels[i].perms.Contains("log_teams"))
  3197. {
  3198. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3199. {
  3200. chan.CreateMessage(Client, builder.Build());
  3201. });
  3202. }
  3203. }
  3204. }
  3205.  
  3206. if (_settings.OutputFormat.OutputTypeTeams == "Simple")
  3207. {
  3208. if (player == team.GetLeader()) return;
  3209. if ((team == null) || (player == null)) return;
  3210. var dict = new Dictionary<string, string>
  3211. {
  3212. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  3213. { "playername", player.displayName },
  3214. { "teamleader", team.GetLeader().displayName },
  3215. { "teamid", team.teamID.ToString() }
  3216. };
  3217. for (int i = 0; i < _channelCount; i++)
  3218. {
  3219. if (_settings.Channels[i].perms.Contains("log_teams"))
  3220. {
  3221. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3222. {
  3223. chan.CreateMessage(Client, Translate("RUST_OnTeamLeave", dict));
  3224. });
  3225. }
  3226. }
  3227. }
  3228. }
  3229. void OnTeamKick(RelationshipManager.PlayerTeam team, BasePlayer player, ulong target)
  3230. {
  3231. if (_settings.OutputFormat.OutputTypeTeams == "Embed")
  3232. {
  3233. NextTick(() =>
  3234. {
  3235. string leaderName = covalence.Players.FindPlayerById(team.teamLeader.ToString())?.Name;
  3236. var targetplayer = GetPlayer(target);
  3237.  
  3238. List<string> players = new List<string>();
  3239. foreach (ulong member in team.members)
  3240. {
  3241. IPlayer memberPlayer = covalence.Players.FindPlayerById(member.ToString());
  3242. if (memberPlayer != null)
  3243. {
  3244. players.Add(GetPlayerFormattedField(memberPlayer));
  3245. }
  3246. else
  3247. {
  3248. players.Add(member.ToString());
  3249. }
  3250. }
  3251.  
  3252. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3253. .AddTitle("TEAM KICK")
  3254. .AddColor("#FF0000")
  3255. .AddThumbnail("https://i.imgur.com/92y7DWt.png")
  3256. .AddDescription($"{targetplayer.Name} was kicked from {leaderName}'s team.")
  3257. .AddField("Team ID", team.teamID.ToString(), true)
  3258. .AddField("Team Leader", leaderName, true)
  3259. .AddField("Team Members", string.Join("\n", players), false)
  3260. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  3261. .AddNowTimestamp();
  3262.  
  3263.  
  3264.  
  3265. for (int i = 0; i < _channelCount; i++)
  3266. {
  3267. if (_settings.Channels[i].perms.Contains("log_teams"))
  3268. {
  3269. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3270. {
  3271. chan.CreateMessage(Client, builder.Build());
  3272. });
  3273. }
  3274. }
  3275. });
  3276. }
  3277. if (_settings.OutputFormat.OutputTypeTeams == "Simple")
  3278. {
  3279. var targetplayer = FindPlayerByID(target.ToString());
  3280. var dict = new Dictionary<string, string>
  3281. {
  3282. { "playername", targetplayer.displayName },
  3283. { "teamleader", team.GetLeader().displayName },
  3284. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  3285. { "teamid", team.teamID.ToString() }
  3286. };
  3287. for (int i = 0; i < _channelCount; i++)
  3288. {
  3289. if (_settings.Channels[i].perms.Contains("log_teams"))
  3290. {
  3291. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3292. {
  3293. chan.CreateMessage(Client, Translate("RUST_OnTeamKicked", dict));
  3294. });
  3295. }
  3296. }
  3297. }
  3298. }
  3299. void OnTeamDisbanded(RelationshipManager.PlayerTeam team)
  3300. {
  3301. if (_settings.OutputFormat.OutputTypeTeams == "Embed")
  3302. {
  3303. string leaderName = covalence.Players.FindPlayerById(team.teamLeader.ToString())?.Name;
  3304.  
  3305. List<string> players = new List<string>();
  3306. foreach (ulong member in team.members)
  3307. {
  3308. IPlayer memberPlayer = covalence.Players.FindPlayerById(member.ToString());
  3309. if (memberPlayer != null)
  3310. {
  3311. players.Add(GetPlayerFormattedField(memberPlayer));
  3312. }
  3313. else
  3314. {
  3315. players.Add(member.ToString());
  3316. }
  3317. }
  3318.  
  3319. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3320. .AddTitle("TEAM DISBANDED")
  3321. .AddColor("#FF0000")
  3322. .AddThumbnail("https://i.imgur.com/B9mPg0l.png")
  3323. .AddField("Team ID", team.teamID.ToString(), true)
  3324. .AddField("Leader", leaderName, true)
  3325. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  3326. .AddNowTimestamp();
  3327.  
  3328. for (int i = 0; i < _channelCount; i++)
  3329. {
  3330. if (_settings.Channels[i].perms.Contains("log_teams"))
  3331. {
  3332. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3333. {
  3334. chan.CreateMessage(Client, builder.Build());
  3335. });
  3336. }
  3337. }
  3338. }
  3339. if (_settings.OutputFormat.OutputTypeTeams == "Simple")
  3340. {
  3341. var dict = new Dictionary<string, string>
  3342. {
  3343. { "teamleader", team.GetLeader().displayName },
  3344. { "teamid", team.teamID.ToString() }
  3345. };
  3346. for (int i = 0; i < _channelCount; i++)
  3347. {
  3348. if (_settings.Channels[i].perms.Contains("log_teams"))
  3349. {
  3350. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3351. {
  3352. chan.CreateMessage(Client, Translate("RUST_OnTeamDisbanded", dict));
  3353. });
  3354. }
  3355. }
  3356. }
  3357. }
  3358. #endregion
  3359.  
  3360. #region Vehicle Spawn Logging
  3361.  
  3362. private void OnEntitySpawned(BaseEntity Entity)
  3363. {
  3364. var dict = new Dictionary<string, string>
  3365. {
  3366. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  3367. };
  3368. if (Entity == null) return;
  3369. if (Entity is PatrolHelicopter)
  3370. {
  3371. for (int i = 0; i < _channelCount; i++)
  3372. {
  3373. if (_settings.Channels[i].perms.Contains("msg_helispawn"))
  3374. {
  3375. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3376. {
  3377. chan.CreateMessage(Client, Translate("RUST_OnHeliSpawn"));
  3378. });
  3379. }
  3380. }
  3381. }
  3382. if (Entity is CargoPlane)
  3383. {
  3384. for (int i = 0; i < _channelCount; i++)
  3385. {
  3386. if (_settings.Channels[i].perms.Contains("msg_planespawn"))
  3387. {
  3388. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3389. {
  3390. chan.CreateMessage(Client, Translate("RUST_OnPlaneSpawn"));
  3391. });
  3392. }
  3393. }
  3394. }
  3395. if (Entity is CargoShip)
  3396. {
  3397. for (int i = 0; i < _channelCount; i++)
  3398. {
  3399. if (_settings.Channels[i].perms.Contains("msg_shipspawn"))
  3400. {
  3401. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3402. {
  3403. chan.CreateMessage(Client, Translate("RUST_OnShipSpawn"));
  3404. });
  3405. }
  3406. }
  3407.  
  3408. }
  3409. if (Entity is CH47Helicopter)
  3410. {
  3411. for (int i = 0; i < _channelCount; i++)
  3412. {
  3413. if (_settings.Channels[i].perms.Contains("msg_chinookspawn"))
  3414. {
  3415. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3416. {
  3417. chan.CreateMessage(Client, Translate("RUST_OnChinookSpawn"));
  3418. });
  3419. }
  3420. }
  3421. }
  3422. if (Entity is BradleyAPC)
  3423. {
  3424. for (int i = 0; i < _channelCount; i++)
  3425. {
  3426. if (_settings.Channels[i].perms.Contains("msg_bradleyspawn"))
  3427. {
  3428. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3429. {
  3430. chan.CreateMessage(Client, Translate("RUST_OnBradleySpawn"));
  3431. });
  3432. }
  3433. }
  3434. }
  3435.  
  3436. }
  3437. #endregion
  3438.  
  3439. #endregion
  3440.  
  3441. #region External Plugin Logging
  3442.  
  3443. #region Admin Hammer
  3444.  
  3445. void OnAdminHammerEnabled(BasePlayer player)
  3446. {
  3447. if (_settings.OutputFormat.OutputTypeAdminHammer == "Simple")
  3448. {
  3449. var dict = new Dictionary<string, string>
  3450. {
  3451. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  3452. { "playername", player.displayName }
  3453. };
  3454. for (int i = 0; i < _channelCount; i++)
  3455. {
  3456. if (_settings.Channels[i].perms.Contains("plugin_adminhammer"))
  3457. {
  3458. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3459. {
  3460. chan.CreateMessage(Client, Translate("PLUGIN_AdminHammer_Enabled", dict));
  3461. });
  3462. }
  3463. }
  3464. }
  3465. if (_settings.OutputFormat.OutputTypeAdminHammer == "Embed")
  3466. {
  3467. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3468. .AddTitle("Admin Hammer Plugin")
  3469. .AddColor("#800080")
  3470. .AddDescription($"{player.displayName} has enabled Admin Hammer.")
  3471. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  3472. .AddNowTimestamp()
  3473. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5ebb965d00f21.png");
  3474.  
  3475. for (int i = 0; i < _channelCount; i++)
  3476. {
  3477. if (_settings.Channels[i].perms.Contains("plugin_adminhammer"))
  3478. {
  3479. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3480. {
  3481. chan.CreateMessage(Client, builder.Build());
  3482. });
  3483. }
  3484. }
  3485. }
  3486.  
  3487. }
  3488. void OnAdminHammerDisabled(BasePlayer player)
  3489. {
  3490. if (_settings.OutputFormat.OutputTypeAdminHammer == "Simple")
  3491. {
  3492. var dict = new Dictionary<string, string>
  3493. {
  3494. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  3495. { "playername", player.displayName }
  3496. };
  3497. for (int i = 0; i < _channelCount; i++)
  3498. {
  3499. if (_settings.Channels[i].perms.Contains("plugin_adminhammer"))
  3500. {
  3501. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3502. {
  3503. chan.CreateMessage(Client, Translate("PLUGIN_AdminHammer_Disabled", dict));
  3504. });
  3505. }
  3506. }
  3507. }
  3508. if (_settings.OutputFormat.OutputTypeAdminHammer == "Embed")
  3509. {
  3510. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3511. .AddTitle("Admin Hammer Plugin")
  3512. .AddColor("#800080")
  3513. .AddDescription($"{player.displayName} has disabled Admin Hammer.")
  3514. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  3515. .AddNowTimestamp()
  3516. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5ebb965d00f21.png");
  3517.  
  3518. for (int i = 0; i < _channelCount; i++)
  3519. {
  3520. if (_settings.Channels[i].perms.Contains("plugin_adminhammer"))
  3521. {
  3522. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3523. {
  3524. chan.CreateMessage(Client, builder.Build());
  3525. });
  3526. }
  3527. }
  3528. }
  3529. }
  3530. #endregion
  3531.  
  3532. #region Admin Radar
  3533. void OnRadarActivated(BasePlayer player)
  3534. {
  3535. if (_settings.OutputFormat.OutputTypeAdminRadar == "Simple")
  3536. {
  3537. var dict = new Dictionary<string, string>
  3538. {
  3539. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  3540. { "playername", player.displayName }
  3541. };
  3542. for (int i = 0; i < _channelCount; i++)
  3543. {
  3544. if (_settings.Channels[i].perms.Contains("plugin_adminradar"))
  3545. {
  3546. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3547. {
  3548. chan.CreateMessage(Client, Translate("PLUGIN_AdminRadar_Enabled", dict));
  3549. });
  3550. }
  3551. }
  3552. }
  3553. if (_settings.OutputFormat.OutputTypeAdminRadar == "Embed")
  3554. {
  3555. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3556. .AddTitle("Admin Radar Plugin")
  3557. .AddUrl("https://umod.org/plugins/admin-radar")
  3558. .AddColor("#800080")
  3559. .AddDescription($"{player.displayName} has enabled Admin Radar.")
  3560. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  3561. .AddNowTimestamp()
  3562. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5b7e1bc17d769.png");
  3563.  
  3564. for (int i = 0; i < _channelCount; i++)
  3565. {
  3566. if (_settings.Channels[i].perms.Contains("plugin_adminradar"))
  3567. {
  3568. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3569. {
  3570. chan.CreateMessage(Client, builder.Build());
  3571. });
  3572. }
  3573. }
  3574. }
  3575. }
  3576. void OnRadarDeactivated(BasePlayer player)
  3577. {
  3578. if (_settings.OutputFormat.OutputTypeAdminRadar == "Simple")
  3579. {
  3580. var dict = new Dictionary<string, string>
  3581. {
  3582. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  3583. { "playername", player.displayName }
  3584. };
  3585. for (int i = 0; i < _channelCount; i++)
  3586. {
  3587. if (_settings.Channels[i].perms.Contains("plugin_adminradar"))
  3588. {
  3589. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3590. {
  3591. chan.CreateMessage(Client, Translate("PLUGIN_AdminRadar_Disabled", dict));
  3592. });
  3593. }
  3594. }
  3595. }
  3596. if (_settings.OutputFormat.OutputTypeAdminRadar == "Embed")
  3597. {
  3598. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3599. .AddTitle("Admin Radar Plugin")
  3600. .AddUrl("https://umod.org/plugins/admin-radar")
  3601. .AddColor("#800080")
  3602. .AddDescription($"{player.displayName} has disabled Admin Radar.")
  3603. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  3604. .AddNowTimestamp()
  3605. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5b7e1bc17d769.png");
  3606.  
  3607. for (int i = 0; i < _channelCount; i++)
  3608. {
  3609. if (_settings.Channels[i].perms.Contains("plugin_adminradar"))
  3610. {
  3611. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3612. {
  3613. chan.CreateMessage(Client, builder.Build());
  3614. });
  3615. }
  3616. }
  3617. }
  3618. }
  3619. #endregion
  3620.  
  3621. #region Better Chat Mute
  3622.  
  3623. private void OnBetterChatMuted(IPlayer target, IPlayer player, string reason)
  3624. {
  3625. if (_settings.OutputFormat.OutputTypeBetterChatMute == "Simple")
  3626. {
  3627. var dict = new Dictionary<string, string>
  3628. {
  3629. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  3630. { "targetname", target.Name },
  3631. { "reason", reason },
  3632. { "muter", player.Name }
  3633. };
  3634. for (int i = 0; i < _channelCount; i++)
  3635. {
  3636. if (_settings.Channels[i].perms.Contains("plugin_betterchatmute"))
  3637. {
  3638. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3639. {
  3640. chan.CreateMessage(Client, Translate("PLUGIN_BetterChatMute_Mute", dict));
  3641. });
  3642. }
  3643. }
  3644. }
  3645. if (_settings.OutputFormat.OutputTypeBetterChatMute == "Embed")
  3646. {
  3647. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3648. .AddTitle("Better Chat Mute Plugin")
  3649. .AddUrl("https://umod.org/plugins/better-chat-mute")
  3650. .AddColor("#800080")
  3651. .AddDescription($"Permanent Mute Issued By: {player.Name}.")
  3652. .AddField("Muted Player", target.Name, false)
  3653. .AddField("Reason", reason, false)
  3654. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  3655. .AddNowTimestamp()
  3656. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5f242f4c92225.png");
  3657.  
  3658. for (int i = 0; i < _channelCount; i++)
  3659. {
  3660. if (_settings.Channels[i].perms.Contains("plugin_betterchatmute"))
  3661. {
  3662. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3663. {
  3664. chan.CreateMessage(Client, builder.Build());
  3665. });
  3666. }
  3667. }
  3668. }
  3669. }
  3670.  
  3671. private void OnBetterChatTimeMuted(IPlayer target, IPlayer player, TimeSpan time, string reason)
  3672. {
  3673. if (_settings.OutputFormat.OutputTypeBetterChatMute == "Simple")
  3674. {
  3675. var dict = new Dictionary<string, string>
  3676. {
  3677. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  3678. { "targetname", target.Name },
  3679. { "reason", reason },
  3680. { "muter", player.Name },
  3681. { "duration", FormatTime((TimeSpan) time) }
  3682. };
  3683. for (int i = 0; i < _channelCount; i++)
  3684. {
  3685. if (_settings.Channels[i].perms.Contains("plugin_betterchatmute"))
  3686. {
  3687. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3688. {
  3689. chan.CreateMessage(Client, Translate("PLUGIN_BetterChatMute_TimedMute", dict));
  3690. });
  3691. }
  3692. }
  3693. }
  3694. if (_settings.OutputFormat.OutputTypeBetterChatMute == "Embed")
  3695. {
  3696. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3697. .AddTitle("Better Chat Mute Plugin")
  3698. .AddUrl("https://umod.org/plugins/better-chat-mute")
  3699. .AddColor("#800080")
  3700. .AddDescription($"Temporary Mute Issued By: {player.Name}.")
  3701. .AddField("Muted Player", target.Name, true)
  3702. .AddField("Duration", FormatTime((TimeSpan)time), true)
  3703. .AddField("Reason", reason, false)
  3704. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  3705. .AddNowTimestamp()
  3706. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5f242f4c92225.png");
  3707.  
  3708. for (int i = 0; i < _channelCount; i++)
  3709. {
  3710. if (_settings.Channels[i].perms.Contains("plugin_betterchatmute"))
  3711. {
  3712. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3713. {
  3714. chan.CreateMessage(Client, builder.Build());
  3715. });
  3716. }
  3717. }
  3718. }
  3719. }
  3720.  
  3721. private void OnBetterChatUnmuted(IPlayer target, IPlayer player)
  3722. {
  3723. if (_settings.OutputFormat.OutputTypeBetterChatMute == "Simple")
  3724. {
  3725. var dict = new Dictionary<string, string>
  3726. {
  3727. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  3728. { "targetname", target.Name },
  3729. { "unmuter", player.Name }
  3730. };
  3731. for (int i = 0; i < _channelCount; i++)
  3732. {
  3733. if (_settings.Channels[i].perms.Contains("plugin_betterchatmute"))
  3734. {
  3735. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3736. {
  3737. chan.CreateMessage(Client, Translate("PLUGIN_BetterChatMute_UnMute", dict));
  3738. });
  3739. }
  3740. }
  3741. }
  3742. if (_settings.OutputFormat.OutputTypeBetterChatMute == "Embed")
  3743. {
  3744. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3745. .AddTitle("Better Chat Mute Plugin")
  3746. .AddUrl("https://umod.org/plugins/better-chat-mute")
  3747. .AddColor("#800080")
  3748. .AddDescription($"{player.Name} removed {target.Name}'s mute.")
  3749. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  3750. .AddNowTimestamp()
  3751. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5f242f4c92225.png");
  3752.  
  3753. for (int i = 0; i < _channelCount; i++)
  3754. {
  3755. if (_settings.Channels[i].perms.Contains("plugin_betterchatmute"))
  3756. {
  3757. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3758. {
  3759. chan.CreateMessage(Client, builder.Build());
  3760. });
  3761. }
  3762. }
  3763. }
  3764. }
  3765.  
  3766.  
  3767. private void OnBetterChatMuteExpired(IPlayer target)
  3768. {
  3769. if (_settings.OutputFormat.OutputTypeBetterChatMute == "Simple")
  3770. {
  3771. var dict = new Dictionary<string, string>
  3772. {
  3773. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  3774. { "targetname", target.Name }
  3775. };
  3776. for (int i = 0; i < _channelCount; i++)
  3777. {
  3778. if (_settings.Channels[i].perms.Contains("plugin_betterchatmute"))
  3779. {
  3780. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3781. {
  3782. chan.CreateMessage(Client, Translate("PLUGIN_BetterChatMute_MuteExpire", dict));
  3783. });
  3784. }
  3785. }
  3786. }
  3787. if (_settings.OutputFormat.OutputTypeBetterChatMute == "Embed")
  3788. {
  3789. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3790. .AddTitle("Better Chat Mute Plugin")
  3791. .AddUrl("https://umod.org/plugins/better-chat-mute")
  3792. .AddColor("#800080")
  3793. .AddDescription($"{target.Name}'s mute has expired.")
  3794. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  3795. .AddNowTimestamp()
  3796. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5f242f4c92225.png");
  3797.  
  3798. for (int i = 0; i < _channelCount; i++)
  3799. {
  3800. if (_settings.Channels[i].perms.Contains("plugin_betterchatmute"))
  3801. {
  3802. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3803. {
  3804. chan.CreateMessage(Client, builder.Build());
  3805. });
  3806. }
  3807. }
  3808. }
  3809. }
  3810. #endregion
  3811.  
  3812. #region Clans
  3813.  
  3814. void OnClanCreate(string tag, string ownerID)
  3815. {
  3816. if ((_settings.PluginLog.LogPluginClans == true) && (_settings.OutputFormat.OutputTypeClans == "Simple"))
  3817. {
  3818. var dict = new Dictionary<string, string>
  3819. {
  3820. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  3821. { "clantag", tag }
  3822. };
  3823. for (int i = 0; i < _channelCount; i++)
  3824. {
  3825. if (_settings.Channels[i].perms.Contains("plugin_clans"))
  3826. {
  3827. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3828. {
  3829. chan.CreateMessage(Client, Translate("PLUGIN_Clans_CreateClan", dict));
  3830. });
  3831. }
  3832. }
  3833.  
  3834. }
  3835. if ((_settings.PluginLog.LogPluginClans == true) && (_settings.OutputFormat.OutputTypeClans == "Embed"))
  3836. {
  3837. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3838. .AddTitle("Clans Plugin")
  3839. .AddUrl("https://umod.org/plugins/clans")
  3840. .AddColor("#800080")
  3841. .AddDescription($"Clan {tag} has been created.")
  3842. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  3843. .AddNowTimestamp()
  3844. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5b63bf642ea2c.jpg");
  3845.  
  3846. for (int i = 0; i < _channelCount; i++)
  3847. {
  3848. if (_settings.Channels[i].perms.Contains("plugin_clans"))
  3849. {
  3850. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3851. {
  3852. chan.CreateMessage(Client, builder.Build());
  3853. });
  3854. }
  3855. }
  3856. }
  3857. }
  3858. void OnClanDisbanded(string tag, List<string> memberUserIDs)
  3859. {
  3860. if ((_settings.PluginLog.LogPluginClans == true) && (_settings.OutputFormat.OutputTypeClans == "Simple"))
  3861. {
  3862. var dict = new Dictionary<string, string>
  3863. {
  3864. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  3865. { "clantag", tag }
  3866. };
  3867. for (int i = 0; i < _channelCount; i++)
  3868. {
  3869. if (_settings.Channels[i].perms.Contains("plugin_clans"))
  3870. {
  3871. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3872. {
  3873. chan.CreateMessage(Client, Translate("PLUGIN_Clans_DisbandClan", dict));
  3874. });
  3875. }
  3876. }
  3877. }
  3878. if ((_settings.PluginLog.LogPluginClans == true) && (_settings.OutputFormat.OutputTypeClans == "Embed"))
  3879. {
  3880. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3881. .AddTitle("Clans Plugin")
  3882. .AddUrl("https://umod.org/plugins/clans")
  3883. .AddColor("#800080")
  3884. .AddDescription($"Clan {tag} has been Disbanded.")
  3885. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  3886. .AddNowTimestamp()
  3887. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5b63bf642ea2c.jpg");
  3888.  
  3889. for (int i = 0; i < _channelCount; i++)
  3890. {
  3891. if (_settings.Channels[i].perms.Contains("plugin_clans"))
  3892. {
  3893. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3894. {
  3895. chan.CreateMessage(Client, builder.Build());
  3896. });
  3897. }
  3898. }
  3899. }
  3900. }
  3901. void OnClanChat(IPlayer player, string message)
  3902. {
  3903. var dict = new Dictionary<string, string>
  3904. {
  3905. { "playername", player.Name },
  3906. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  3907. { "message", message }
  3908. };
  3909. if (player.Name == null || message == null) return;
  3910. for (int i = 0; i < _channelCount; i++)
  3911. {
  3912. if (_settings.Channels[i].perms.Contains("plugin_clanchat"))
  3913. {
  3914. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3915. {
  3916. chan.CreateMessage(Client, Translate("PLUGIN_Clans_Chat", dict));
  3917. });
  3918. }
  3919. }
  3920. }
  3921. #endregion
  3922.  
  3923. #region Dangerous Treasures
  3924.  
  3925. private void OnDangerousEventStarted(Vector3 containerPos)
  3926. {
  3927. if (containerPos == null) return;
  3928. if (_settings.OutputFormat.OutputTypeDangerousTreasures == "Simple")
  3929. {
  3930. var dict = new Dictionary<string, string>
  3931. {
  3932. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  3933. { "position", containerPos.ToString() },
  3934. { "gridposition", FindGridPosition(containerPos).ToString() }
  3935. };
  3936. for (int i = 0; i < _channelCount; i++)
  3937. {
  3938. if (_settings.Channels[i].perms.Contains("plugin_dangeroustreasures"))
  3939. {
  3940. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3941. {
  3942. chan.CreateMessage(Client, Translate("PLUGIN_DangerousTreasures_Started", dict));
  3943. });
  3944. }
  3945. }
  3946. }
  3947. if (_settings.OutputFormat.OutputTypeDangerousTreasures == "Embed")
  3948. {
  3949. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3950. .AddTitle("Dangerous Treasures Plugin")
  3951. .AddUrl("https://umod.org/plugins/dangerous-treasures")
  3952. .AddDescription("Dangerous Event Started")
  3953. .AddField("Position", $"{ FindGridPosition(containerPos)} {containerPos} ", true)
  3954. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  3955. .AddNowTimestamp()
  3956. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5b7d66ce65af7.png");
  3957.  
  3958. for (int i = 0; i < _channelCount; i++)
  3959. {
  3960. if (_settings.Channels[i].perms.Contains("plugin_dangeroustreasures"))
  3961. {
  3962. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3963. {
  3964. chan.CreateMessage(Client, builder.Build());
  3965. });
  3966. }
  3967. }
  3968. }
  3969. }
  3970. private void OnDangerousEventEnded(Vector3 containerPos)
  3971. {
  3972. if (containerPos == null) return;
  3973. if (_settings.OutputFormat.OutputTypeDangerousTreasures == "Simple")
  3974. {
  3975. var dict = new Dictionary<string, string>
  3976. {
  3977. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  3978. { "position", containerPos.ToString() },
  3979. { "gridposition", FindGridPosition(containerPos).ToString() }
  3980. };
  3981. for (int i = 0; i < _channelCount; i++)
  3982. {
  3983. if (_settings.Channels[i].perms.Contains("plugin_dangeroustreasures"))
  3984. {
  3985. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  3986. {
  3987. chan.CreateMessage(Client, Translate("PLUGIN_DangerousTreasures_Ended", dict));
  3988. });
  3989. }
  3990. }
  3991. }
  3992. if (_settings.OutputFormat.OutputTypeDangerousTreasures == "Embed")
  3993. {
  3994. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  3995. .AddTitle("Dangerous Treasures Plugin")
  3996. .AddUrl("https://umod.org/plugins/dangerous-treasures")
  3997. .AddDescription("Dangerous Event Ended")
  3998. .AddField("Position", $"{FindGridPosition(containerPos)} {containerPos} ", true)
  3999. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4000. .AddNowTimestamp()
  4001. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5b7d66ce65af7.png");
  4002.  
  4003. for (int i = 0; i < _channelCount; i++)
  4004. {
  4005. if (_settings.Channels[i].perms.Contains("plugin_dangeroustreasures"))
  4006. {
  4007. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4008. {
  4009. chan.CreateMessage(Client, builder.Build());
  4010. });
  4011. }
  4012. }
  4013. }
  4014. }
  4015. #endregion
  4016.  
  4017. #region Death Notes
  4018. private void OnDeathNotice(Dictionary<string, object> data, string message)
  4019. {
  4020. if (Client == null) return;
  4021. if (data["VictimEntityType"] == null || data["KillerEntityType"] == null) return;
  4022. int victimType = (int)data["VictimEntityType"];
  4023. int killerType = (int)data["KillerEntityType"];
  4024.  
  4025. var _DeathNotes = plugins.Find("DeathNotes");
  4026. var deathmessage = (string)_DeathNotes.Call("StripRichText", message);
  4027.  
  4028. var dict = new Dictionary<string, string>
  4029. {
  4030. { "deathmessage", deathmessage},
  4031. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  4032. };
  4033.  
  4034. if (_DeathNotes != null)
  4035. if ((victimType == 5 && (killerType == 5 || killerType == 6 || killerType == 7 || killerType == 8 || killerType == 9 || killerType == 10 || killerType == 11 || killerType == 12 || killerType == 14 || killerType == 15)))
  4036.  
  4037.  
  4038. {
  4039. for (int i = 0; i < _channelCount; i++)
  4040. {
  4041. if (_settings.Channels[i].perms.Contains("plugin_deathnotes_pvp"))
  4042. {
  4043. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4044. {
  4045. chan.CreateMessage(Client, Translate("PLUGIN_DeathNotes_Death", dict));
  4046. });
  4047. }
  4048. }
  4049.  
  4050. }
  4051. else if ((victimType == 2 && killerType == 5) || (victimType == 5 && killerType == 2))
  4052. {
  4053. for (int i = 0; i < _channelCount; i++)
  4054. {
  4055. if (_settings.Channels[i].perms.Contains("plugin_deathnotes_animal"))
  4056. {
  4057. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4058. {
  4059. chan.CreateMessage(Client, Translate("PLUGIN_DeathNotes_Death", dict));
  4060. });
  4061. }
  4062. }
  4063.  
  4064. }
  4065. else if ((victimType == 5 && (killerType == 0 || killerType == 1)) || ((victimType == 0 || victimType == 1) && (killerType == 5)))
  4066. {
  4067. message = (string)_DeathNotes.Call("StripRichText", message);
  4068.  
  4069. for (int i = 0; i < _channelCount; i++)
  4070. {
  4071. if (_settings.Channels[i].perms.Contains("plugin_deathnotes_vehicle"))
  4072. {
  4073. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4074. {
  4075. chan.CreateMessage(Client, Translate("PLUGIN_DeathNotes_Death", dict));
  4076. });
  4077. }
  4078. }
  4079. }
  4080. else if ((victimType == 5 && (killerType == 3 || killerType == 4 || killerType == 16 || killerType == 17 || killerType == 18)) || ((victimType == 3 || victimType == 4 || victimType == 16 || victimType == 17 || victimType == 18) && (killerType == 5)))
  4081. {
  4082. message = (string)_DeathNotes.Call("StripRichText", message);
  4083.  
  4084. for (int i = 0; i < _channelCount; i++)
  4085. {
  4086. if (_settings.Channels[i].perms.Contains("plugin_deathnotes_npc"))
  4087. {
  4088. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4089. {
  4090. chan.CreateMessage(Client, Translate("PLUGIN_DeathNotes_Death", dict));
  4091. });
  4092. }
  4093. }
  4094.  
  4095. }
  4096.  
  4097. }
  4098. #endregion
  4099.  
  4100. #region Discord Auth
  4101. private void OnDiscordPlayerLinked(IPlayer player, DiscordUser user)
  4102. {
  4103. if (player == null || user == null) return;
  4104. if (_settings.OutputFormat.OutputTypeDiscordAuth == "Simple")
  4105. {
  4106. var dict = new Dictionary<string, string>
  4107. {
  4108. { "gamename", player.Name },
  4109. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  4110. { "discordname", user.FullUserName }
  4111. };
  4112. for (int i = 0; i < _channelCount; i++)
  4113. {
  4114. if (_settings.Channels[i].perms.Contains("plugin_discordauth"))
  4115. {
  4116. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4117. {
  4118. chan.CreateMessage(Client, Translate("PLUGIN_DiscordAuth_Auth", dict));
  4119. });
  4120. }
  4121. }
  4122. }
  4123. if (_settings.OutputFormat.OutputTypeDiscordAuth == "Embed")
  4124. {
  4125. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4126. .AddTitle("Discord Auth Plugin")
  4127. .AddUrl("https://umod.org/plugins/discord-auth")
  4128. .AddColor("#800080")
  4129. .AddDescription("Player Account Linked.")
  4130. .AddField("Rust Player", player.Name, true)
  4131. .AddField("Discord Account", user.FullUserName, true)
  4132. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4133. .AddNowTimestamp()
  4134. .AddColor("#00FF00")
  4135. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5d20e5691c3c5.png");
  4136.  
  4137. for (int i = 0; i < _channelCount; i++)
  4138. {
  4139. if (_settings.Channels[i].perms.Contains("plugin_discordauth"))
  4140. {
  4141. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4142. {
  4143. chan.CreateMessage(Client, builder.Build());
  4144. });
  4145. }
  4146. }
  4147. }
  4148.  
  4149. }
  4150. private void OnDiscordPlayerUnlinked(IPlayer player, DiscordUser user)
  4151. {
  4152. if (player == null || user == null) return;
  4153. if (_settings.OutputFormat.OutputTypeDiscordAuth == "Simple")
  4154. {
  4155. var dict = new Dictionary<string, string>
  4156. {
  4157. { "gamename", player.Name },
  4158. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  4159. { "discordname", user.FullUserName }
  4160. };
  4161. for (int i = 0; i < _channelCount; i++)
  4162. {
  4163. if (_settings.Channels[i].perms.Contains("plugin_discordauth"))
  4164. {
  4165. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4166. {
  4167. chan.CreateMessage(Client, Translate("PLUGIN_DiscordAuth_Deauth", dict));
  4168. });
  4169. }
  4170. }
  4171. }
  4172. if (_settings.OutputFormat.OutputTypeDiscordAuth == "Embed")
  4173. {
  4174. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4175. .AddTitle("Discord Auth Plugin")
  4176. .AddUrl("https://umod.org/plugins/discord-auth")
  4177. .AddColor("#800080")
  4178. .AddDescription($"{player.Name} Unlinked From Discord.")
  4179. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4180. .AddNowTimestamp()
  4181. .AddColor("#FF0000")
  4182. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5d20e5691c3c5.png");
  4183.  
  4184. for (int i = 0; i < _channelCount; i++)
  4185. {
  4186. if (_settings.Channels[i].perms.Contains("plugin_discordauth"))
  4187. {
  4188. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4189. {
  4190. chan.CreateMessage(Client, builder.Build());
  4191. });
  4192. }
  4193. }
  4194. }
  4195. }
  4196. #endregion
  4197.  
  4198. #region Godmode
  4199. private void OnGodmodeToggled(string playerId, bool enabled)
  4200. {
  4201. var player = covalence.Players.FindPlayerById(playerId);
  4202. if (player.Name == null) return;
  4203. if (_settings.OutputFormat.OutputTypeGodmode == "Simple")
  4204. {
  4205. var dict = new Dictionary<string, string>
  4206. {
  4207. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  4208. { "playername", player.Name }
  4209. };
  4210. for (int i = 0; i < _channelCount; i++)
  4211. {
  4212. if (_settings.Channels[i].perms.Contains("plugin_godmode"))
  4213. {
  4214. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4215. {
  4216. if (enabled == true)
  4217. {
  4218. chan.CreateMessage(Client, Translate("PLUGIN_Godmode_Enabled", dict));
  4219. }
  4220. if (enabled == false)
  4221. {
  4222. chan.CreateMessage(Client, Translate("PLUGIN_Godmode_Disabled", dict));
  4223. }
  4224. });
  4225. }
  4226. }
  4227. }
  4228. if (_settings.OutputFormat.OutputTypeGodmode == "Embed")
  4229. {
  4230. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4231. .AddTitle("Godmode Plugin")
  4232. .AddUrl("https://umod.org/plugins/godmode")
  4233. .AddColor("#800080")
  4234. .AddDescription("Godmode has been toggled")
  4235. .AddField("Player", player.Name, true)
  4236. .AddField("Enabled", enabled.ToString(), true)
  4237. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4238. .AddNowTimestamp()
  4239. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5b6394e5e597b.jpg");
  4240.  
  4241. for (int i = 0; i < _channelCount; i++)
  4242. {
  4243. if (_settings.Channels[i].perms.Contains("plugin_godmode"))
  4244. {
  4245. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4246. {
  4247. chan.CreateMessage(Client, builder.Build());
  4248. });
  4249. }
  4250. }
  4251. }
  4252. }
  4253. #endregion
  4254.  
  4255. #region Kits
  4256. void OnKitRedeemed(BasePlayer player, string kitName)
  4257. {
  4258. if (player == null || kitName == null) return;
  4259. if (_settings.OutputFormat.OutputTypeKits == "Simple")
  4260. {
  4261. var dict = new Dictionary<string, string>
  4262. {
  4263. { "kitname", kitName },
  4264. { "playername", player.displayName }
  4265. };
  4266. for (int i = 0; i < _channelCount; i++)
  4267. {
  4268. if (_settings.Channels[i].perms.Contains("plugin_kits"))
  4269. {
  4270.  
  4271. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4272. {
  4273. chan.CreateMessage(Client, Translate("PLUGIN_Kits_Redeemed", dict));
  4274. });
  4275. }
  4276. }
  4277. }
  4278. if (_settings.OutputFormat.OutputTypeKits == "Embed")
  4279. {
  4280. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4281. .AddTitle("Kits Plugin")
  4282. .AddUrl("https://umod.org/plugins/kits")
  4283. .AddColor("#800080")
  4284. .AddDescription($"{player.displayName} has redeemd a kit.")
  4285. .AddField("Kit", kitName, true)
  4286. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4287. .AddNowTimestamp()
  4288. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5b910ab50f5d1.png");
  4289.  
  4290. for (int i = 0; i < _channelCount; i++)
  4291. {
  4292. if (_settings.Channels[i].perms.Contains("plugin_kits"))
  4293. {
  4294. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4295. {
  4296. chan.CreateMessage(Client, builder.Build());
  4297. });
  4298. }
  4299. }
  4300. }
  4301. }
  4302. #endregion
  4303.  
  4304. #region Private Messages
  4305. [HookMethod("OnPMProcessed")]
  4306. void OnPMProcessed(IPlayer sender, IPlayer target, string message)
  4307. {
  4308. if (_settings.OutputFormat.OutputTypePMs == "Simple")
  4309. {
  4310. var dict = new Dictionary<string, string>
  4311. {
  4312. { "sendername", sender.Name },
  4313. { "targetname", target.Name },
  4314. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  4315. { "message", message }
  4316. };
  4317.  
  4318. for (int i = 0; i < _channelCount; i++)
  4319. {
  4320. if (_settings.Channels[i].perms.Contains("plugin_privatemessages"))
  4321. {
  4322. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4323. {
  4324. chan.CreateMessage(Client, Translate("PLUGIN_PrivateMessages_PM", dict));
  4325. });
  4326. }
  4327. }
  4328. }
  4329. if (_settings.OutputFormat.OutputTypePMs == "Embed")
  4330. {
  4331. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4332. .AddTitle("Private Messages Plugin")
  4333. .AddUrl("https://umod.org/plugins/private-messages")
  4334. .AddColor("#800080")
  4335. .AddField("From", sender.Name, true)
  4336. .AddField("To", target.Name, true)
  4337. .AddField("Message", message, false)
  4338. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4339. .AddNowTimestamp()
  4340. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5b66ed6b7e606.jpg");
  4341.  
  4342. for (int i = 0; i < _channelCount; i++)
  4343. {
  4344. if (_settings.Channels[i].perms.Contains("plugin_privatemessages"))
  4345. {
  4346. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4347. {
  4348. chan.CreateMessage(Client, builder.Build());
  4349. });
  4350. }
  4351. }
  4352. }
  4353. }
  4354. #endregion
  4355.  
  4356. #region Raidable Bases
  4357. void OnRaidableBaseStarted(Vector3 pos, int difficulty)
  4358. {
  4359. string rbdiff = string.Empty;
  4360. if (difficulty == 0) rbdiff = "Easy";
  4361. if (difficulty == 1) rbdiff = "Medium";
  4362. if (difficulty == 2) rbdiff = "Hard";
  4363. if (difficulty == 3) rbdiff = "Expert";
  4364. if (difficulty == 4) rbdiff = "Nightmare";
  4365. if (difficulty == 512) rbdiff = "Normal";
  4366.  
  4367. if (_settings.OutputFormat.OutputTypeRaidableBases == "Simple")
  4368. {
  4369. var dict = new Dictionary<string, string>
  4370. {
  4371. { "position", pos.ToString() },
  4372. { "gridposition", FindGridPosition(pos).ToString() },
  4373. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  4374. { "difficulty", rbdiff }
  4375. };
  4376.  
  4377. for (int i = 0; i < _channelCount; i++)
  4378. {
  4379. if (_settings.Channels[i].perms.Contains("plugin_raidablebases"))
  4380. {
  4381. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4382. {
  4383. chan.CreateMessage(Client, Translate("PLUGIN_RaidableBases_Started", dict));
  4384. });
  4385. }
  4386. }
  4387. }
  4388. if (_settings.OutputFormat.OutputTypeRaidableBases == "Embed")
  4389. {
  4390. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4391. .AddTitle("Raidable Bases Plugin")
  4392. .AddUrl("https://umod.org/plugins/raidable-bases")
  4393. .AddColor("#800080")
  4394. .AddDescription("A Raidable Base Has Spawned.")
  4395. .AddField("Difficulty", rbdiff, true)
  4396. .AddField("Location", $"{FindGridPosition(pos)} {pos}", true)
  4397. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4398. .AddNowTimestamp()
  4399. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5e986213be8c8.png");
  4400.  
  4401. for (int i = 0; i < _channelCount; i++)
  4402. {
  4403. if (_settings.Channels[i].perms.Contains("plugin_raidablebases"))
  4404. {
  4405. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4406. {
  4407. chan.CreateMessage(Client, builder.Build());
  4408. });
  4409. }
  4410. }
  4411. }
  4412. }
  4413. void OnRaidableBaseEnded(Vector3 pos, int difficulty)
  4414. {
  4415. string rbdiff = string.Empty;
  4416. if (difficulty == 0) rbdiff = "Easy";
  4417. if (difficulty == 1) rbdiff = "Medium";
  4418. if (difficulty == 2) rbdiff = "Hard";
  4419.  
  4420. if (_settings.OutputFormat.OutputTypeRaidableBases == "Simple")
  4421. {
  4422. var dict = new Dictionary<string, string>
  4423. {
  4424. { "position", pos.ToString() },
  4425. { "gridposition", FindGridPosition(pos).ToString() },
  4426. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  4427. { "difficulty", rbdiff }
  4428. };
  4429.  
  4430. for (int i = 0; i < _channelCount; i++)
  4431. {
  4432. if (_settings.Channels[i].perms.Contains("plugin_raidablebases"))
  4433. {
  4434. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4435. {
  4436. chan.CreateMessage(Client, Translate("PLUGIN_RaidableBases_Ended", dict));
  4437. });
  4438. }
  4439. }
  4440. }
  4441. if (_settings.OutputFormat.OutputTypeRaidableBases == "Embed")
  4442. {
  4443. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4444. .AddTitle("Raidable Bases Plugin")
  4445. .AddUrl("https://umod.org/plugins/raidable-bases")
  4446. .AddColor("#800080")
  4447. .AddDescription($"Raidable Base at {FindGridPosition(pos)} Has Ended.")
  4448. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4449. .AddNowTimestamp()
  4450. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5e986213be8c8.png");
  4451.  
  4452. for (int i = 0; i < _channelCount; i++)
  4453. {
  4454. if (_settings.Channels[i].perms.Contains("plugin_raidablebases"))
  4455. {
  4456. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4457. {
  4458. chan.CreateMessage(Client, builder.Build());
  4459. });
  4460. }
  4461. }
  4462. }
  4463. }
  4464. #endregion
  4465.  
  4466. #region Sign Artist
  4467. private void OnImagePost(BasePlayer player, string image)
  4468. {
  4469. var dict = new Dictionary<string, string>
  4470. {
  4471. { "playername", player.displayName },
  4472. { "position", $"{player.transform.position.x} {player.transform.position.y} {player.transform.position.z}" }
  4473. };
  4474.  
  4475. for (int i = 0; i < _channelCount; i++)
  4476. {
  4477. if (_settings.Channels[i].perms.Contains("plugin_signartist"))
  4478. {
  4479. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4480. {
  4481. chan.CreateMessage(Client, SignArtistEmbed(Translate("PLUGIN_SignArtist", dict), image));
  4482. });
  4483. }
  4484. }
  4485. }
  4486.  
  4487. private DiscordEmbed SignArtistEmbed(string text, string image)
  4488. {
  4489. DiscordEmbed embed = new DiscordEmbedBuilder()
  4490. .AddTitle("SignArtist Plugin")
  4491. .AddUrl("https://umod.org/plugins/sign-artist")
  4492. .AddThumbnail("https://i.imgur.com/NBu6OjS.png")
  4493. .AddDescription(text)
  4494. .AddColor(52326)
  4495. .AddImage(image)
  4496. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4497. .AddNowTimestamp()
  4498. .Build();
  4499.  
  4500. return embed;
  4501. }
  4502. #endregion
  4503.  
  4504. #region Vanish
  4505. void OnVanishDisappear(BasePlayer player)
  4506. {
  4507. if (_settings.OutputFormat.OutputTypeVanish == "Simple")
  4508. {
  4509. var dict = new Dictionary<string, string>
  4510. {
  4511. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  4512. { "playername", player.displayName }
  4513. };
  4514. for (int i = 0; i < _channelCount; i++)
  4515. {
  4516. if (_settings.Channels[i].perms.Contains("plugin_vanish"))
  4517. {
  4518.  
  4519. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4520. {
  4521. chan.CreateMessage(Client, Translate("PLUGIN_Vanish_Disappear", dict));
  4522. });
  4523. }
  4524. }
  4525. }
  4526. if (_settings.OutputFormat.OutputTypeVanish == "Embed")
  4527. {
  4528. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4529. .AddTitle("Vanish Plugin")
  4530. .AddUrl("https://umod.org/plugins/vanish")
  4531. .AddColor("#800080")
  4532. .AddDescription($"{player.displayName} has vanished.")
  4533. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4534. .AddNowTimestamp()
  4535. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5e2c4da074770.png");
  4536.  
  4537. for (int i = 0; i < _channelCount; i++)
  4538. {
  4539. if (_settings.Channels[i].perms.Contains("plugin_vanish"))
  4540. {
  4541. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4542. {
  4543. chan.CreateMessage(Client, builder.Build());
  4544. });
  4545. }
  4546. }
  4547. }
  4548. }
  4549. void OnVanishReappear(BasePlayer player)
  4550. {
  4551. if (_settings.OutputFormat.OutputTypeVanish == "Simple")
  4552. {
  4553. var dict = new Dictionary<string, string>
  4554. {
  4555. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")},
  4556. { "playername", player.displayName }
  4557. };
  4558. for (int i = 0; i < _channelCount; i++)
  4559. {
  4560. if (_settings.Channels[i].perms.Contains("plugin_vanish"))
  4561. {
  4562. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4563. {
  4564. chan.CreateMessage(Client, Translate("PLUGIN_Vanish_Reappear", dict));
  4565. });
  4566. }
  4567. }
  4568. }
  4569. if (_settings.OutputFormat.OutputTypeVanish == "Embed")
  4570. {
  4571. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4572. .AddTitle("Vanish Plugin")
  4573. .AddUrl("https://umod.org/plugins/vanish")
  4574. .AddColor("#800080")
  4575. .AddDescription($"{player.displayName} has reappeared.")
  4576. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4577. .AddNowTimestamp()
  4578. .AddThumbnail("https://assets.umod.org/images/icons/plugin/5e2c4da074770.png");
  4579.  
  4580. for (int i = 0; i < _channelCount; i++)
  4581. {
  4582. if (_settings.Channels[i].perms.Contains("plugin_vanish"))
  4583. {
  4584. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4585. {
  4586. chan.CreateMessage(Client, builder.Build());
  4587. });
  4588. }
  4589. }
  4590. }
  4591. }
  4592. #endregion
  4593.  
  4594.  
  4595. #endregion
  4596.  
  4597. #region Premium Plugins
  4598.  
  4599. #region Air Event
  4600. void OnAirEventStart(HashSet<BaseEntity> entities)
  4601. {
  4602. if (_settings.OutputFormat.OutputTypeAirEvent == "Simple")
  4603. {
  4604. var dict = new Dictionary<string, string>
  4605. {
  4606. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  4607. };
  4608. for (int i = 0; i < _channelCount; i++)
  4609. {
  4610. if (_settings.Channels[i].perms.Contains("plugin_airevent"))
  4611. {
  4612.  
  4613. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4614. {
  4615. chan.CreateMessage(Client, Translate("PLUGIN_AirEvent_Started", dict));
  4616. });
  4617. }
  4618. }
  4619. }
  4620. if (_settings.OutputFormat.OutputTypeAirEvent == "Embed")
  4621. {
  4622. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4623. .AddTitle("Air Event Plugin")
  4624. .AddUrl("https://lone.design/product/airevent/")
  4625. .AddColor("#800080")
  4626. .AddDescription("Air Event has started.")
  4627. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4628. .AddNowTimestamp()
  4629. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1010785120237649961/unknown.png");
  4630.  
  4631. for (int i = 0; i < _channelCount; i++)
  4632. {
  4633. if (_settings.Channels[i].perms.Contains("plugin_airevent"))
  4634. {
  4635. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4636. {
  4637. chan.CreateMessage(Client, builder.Build());
  4638. });
  4639. }
  4640. }
  4641. }
  4642. }
  4643. void OnAirEventEnd(HashSet<BaseEntity> entities)
  4644. {
  4645. if (_settings.OutputFormat.OutputTypeAirEvent == "Simple")
  4646. {
  4647. var dict = new Dictionary<string, string>
  4648. {
  4649. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  4650. };
  4651. for (int i = 0; i < _channelCount; i++)
  4652. {
  4653. if (_settings.Channels[i].perms.Contains("plugin_airevent"))
  4654. {
  4655.  
  4656. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4657. {
  4658. chan.CreateMessage(Client, Translate("PLUGIN_AirEvent_Ended", dict));
  4659. });
  4660. }
  4661. }
  4662. }
  4663. if (_settings.OutputFormat.OutputTypeAirEvent == "Embed")
  4664. {
  4665. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4666. .AddTitle("Air Event Plugin")
  4667. .AddUrl("https://lone.design/product/airevent/")
  4668. .AddColor("#800080")
  4669. .AddDescription("Air Event has ended.")
  4670. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4671. .AddNowTimestamp()
  4672. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1010785120237649961/unknown.png");
  4673.  
  4674. for (int i = 0; i < _channelCount; i++)
  4675. {
  4676. if (_settings.Channels[i].perms.Contains("plugin_airevent"))
  4677. {
  4678. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4679. {
  4680. chan.CreateMessage(Client, builder.Build());
  4681. });
  4682. }
  4683. }
  4684. }
  4685. }
  4686. #endregion
  4687.  
  4688. #region Armored Train Event
  4689. void OnArmoredTrainEventStart()
  4690. {
  4691. if (_settings.OutputFormat.OutputTypeArmoredTrainEvent == "Simple")
  4692. {
  4693. var dict = new Dictionary<string, string>
  4694. {
  4695. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  4696. };
  4697. for (int i = 0; i < _channelCount; i++)
  4698. {
  4699. if (_settings.Channels[i].perms.Contains("plugin_armoredtrainevent"))
  4700. {
  4701.  
  4702. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4703. {
  4704. chan.CreateMessage(Client, Translate("PLUGIN_ArmoredTrainEvent_Started", dict));
  4705. });
  4706. }
  4707. }
  4708. }
  4709. if (_settings.OutputFormat.OutputTypeArmoredTrainEvent == "Embed")
  4710. {
  4711. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4712. .AddTitle("Armored Train Event Plugin")
  4713. .AddUrl("https://lone.design/product/armored-train-rust-plugin/")
  4714. .AddColor("#800080")
  4715. .AddDescription("Armored Train Event has started.")
  4716. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4717. .AddNowTimestamp()
  4718. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1012196381617815584/unknown.png");
  4719.  
  4720. for (int i = 0; i < _channelCount; i++)
  4721. {
  4722. if (_settings.Channels[i].perms.Contains("plugin_armoredtrainevent"))
  4723. {
  4724. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4725. {
  4726. chan.CreateMessage(Client, builder.Build());
  4727. });
  4728. }
  4729. }
  4730. }
  4731. }
  4732. void OnArmoredTrainEventStop()
  4733. {
  4734. if (_settings.OutputFormat.OutputTypeArmoredTrainEvent == "Simple")
  4735. {
  4736. var dict = new Dictionary<string, string>
  4737. {
  4738. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  4739. };
  4740. for (int i = 0; i < _channelCount; i++)
  4741. {
  4742. if (_settings.Channels[i].perms.Contains("plugin_armoredtrainevent"))
  4743. {
  4744.  
  4745. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4746. {
  4747. chan.CreateMessage(Client, Translate("PLUGIN_ArmoredTrainEvent_Ended", dict));
  4748. });
  4749. }
  4750. }
  4751. }
  4752. if (_settings.OutputFormat.OutputTypeArmoredTrainEvent == "Embed")
  4753. {
  4754. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4755. .AddTitle("Armored Train Event Plugin")
  4756. .AddUrl("https://lone.design/product/armored-train-rust-plugin/")
  4757. .AddColor("#800080")
  4758. .AddDescription("Armored Train Event has ended.")
  4759. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4760. .AddNowTimestamp()
  4761. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1012196381617815584/unknown.png");
  4762.  
  4763. for (int i = 0; i < _channelCount; i++)
  4764. {
  4765. if (_settings.Channels[i].perms.Contains("plugin_armoredtrainevent"))
  4766. {
  4767. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4768. {
  4769. chan.CreateMessage(Client, builder.Build());
  4770. });
  4771. }
  4772. }
  4773. }
  4774. }
  4775. #endregion
  4776.  
  4777. #region Cargo Train Event
  4778. void OnTrainEventStarted(TrainEngine train)
  4779. {
  4780. if (_settings.OutputFormat.OutputTypeCargoTrainEvent == "Simple")
  4781. {
  4782. var dict = new Dictionary<string, string>
  4783. {
  4784. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  4785. };
  4786. for (int i = 0; i < _channelCount; i++)
  4787. {
  4788. if (_settings.Channels[i].perms.Contains("plugin_cargotrainevent"))
  4789. {
  4790.  
  4791. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4792. {
  4793. chan.CreateMessage(Client, Translate("PLUGIN_CargoTrainEvent_Started", dict));
  4794. });
  4795. }
  4796. }
  4797. }
  4798. if (_settings.OutputFormat.OutputTypeCargoTrainEvent == "Embed")
  4799. {
  4800. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4801. .AddTitle("Cargo Train Event Plugin")
  4802. .AddUrl("https://lone.design/product/cargo-train-event-rust/")
  4803. .AddColor("#800080")
  4804. .AddDescription("Cargo Train Event has started.")
  4805. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4806. .AddNowTimestamp()
  4807. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1012200951647588422/unknown.png");
  4808.  
  4809. for (int i = 0; i < _channelCount; i++)
  4810. {
  4811. if (_settings.Channels[i].perms.Contains("plugin_cargotrainevent"))
  4812. {
  4813. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4814. {
  4815. chan.CreateMessage(Client, builder.Build());
  4816. });
  4817. }
  4818. }
  4819. }
  4820. }
  4821. void OnTrainEventEnded(TrainEngine train)
  4822. {
  4823. if (_settings.OutputFormat.OutputTypeCargoTrainEvent == "Simple")
  4824. {
  4825. var dict = new Dictionary<string, string>
  4826. {
  4827. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  4828. };
  4829. for (int i = 0; i < _channelCount; i++)
  4830. {
  4831. if (_settings.Channels[i].perms.Contains("plugin_cargotrainevent"))
  4832. {
  4833.  
  4834. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4835. {
  4836. chan.CreateMessage(Client, Translate("PLUGIN_CargoTrainEvent_Ended", dict));
  4837. });
  4838. }
  4839. }
  4840. }
  4841. if (_settings.OutputFormat.OutputTypeCargoTrainEvent == "Embed")
  4842. {
  4843. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4844. .AddTitle("Cargo Train Event Plugin")
  4845. .AddUrl("https://lone.design/product/cargo-train-event-rust/")
  4846. .AddColor("#800080")
  4847. .AddDescription("Cargo Train Event has ended.")
  4848. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4849. .AddNowTimestamp()
  4850. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1012200951647588422/unknown.png");
  4851.  
  4852. for (int i = 0; i < _channelCount; i++)
  4853. {
  4854. if (_settings.Channels[i].perms.Contains("plugin_cargotrainevent"))
  4855. {
  4856. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4857. {
  4858. chan.CreateMessage(Client, builder.Build());
  4859. });
  4860. }
  4861. }
  4862. }
  4863. }
  4864. #endregion
  4865.  
  4866. #region Convoy Event
  4867. void OnConvoyStart()
  4868. {
  4869. if (_settings.OutputFormat.OutputTypeConvoyEvent == "Simple")
  4870. {
  4871. var dict = new Dictionary<string, string>
  4872. {
  4873. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  4874. };
  4875. for (int i = 0; i < _channelCount; i++)
  4876. {
  4877. if (_settings.Channels[i].perms.Contains("plugin_convoyevent"))
  4878. {
  4879.  
  4880. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4881. {
  4882. chan.CreateMessage(Client, Translate("PLUGIN_ConvoyEvent_Started", dict));
  4883. });
  4884. }
  4885. }
  4886. }
  4887. if (_settings.OutputFormat.OutputTypeConvoyEvent == "Embed")
  4888. {
  4889. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4890. .AddTitle("Convoy Event Plugin")
  4891. .AddUrl("https://lone.design/product/convoy-rust-plugin/")
  4892. .AddColor("#800080")
  4893. .AddDescription("Convoy Event has started.")
  4894. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4895. .AddNowTimestamp()
  4896. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1012202423940567150/unknown.png");
  4897.  
  4898. for (int i = 0; i < _channelCount; i++)
  4899. {
  4900. if (_settings.Channels[i].perms.Contains("plugin_convoyevent"))
  4901. {
  4902. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4903. {
  4904. chan.CreateMessage(Client, builder.Build());
  4905. });
  4906. }
  4907. }
  4908. }
  4909. }
  4910. void OnConvoyStop()
  4911. {
  4912. if (_settings.OutputFormat.OutputTypeConvoyEvent == "Simple")
  4913. {
  4914. var dict = new Dictionary<string, string>
  4915. {
  4916. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  4917. };
  4918. for (int i = 0; i < _channelCount; i++)
  4919. {
  4920. if (_settings.Channels[i].perms.Contains("plugin_convoyevent"))
  4921. {
  4922.  
  4923. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4924. {
  4925. chan.CreateMessage(Client, Translate("PLUGIN_ConvoyEvent_Ended", dict));
  4926. });
  4927. }
  4928. }
  4929. }
  4930. if (_settings.OutputFormat.OutputTypeConvoyEvent == "Embed")
  4931. {
  4932. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4933. .AddTitle("Convoy Event Plugin")
  4934. .AddUrl("https://lone.design/product/convoy-rust-plugin/")
  4935. .AddColor("#800080")
  4936. .AddDescription("Convoy Event has ended.")
  4937. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4938. .AddNowTimestamp()
  4939. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1012202423940567150/unknown.png");
  4940.  
  4941. for (int i = 0; i < _channelCount; i++)
  4942. {
  4943. if (_settings.Channels[i].perms.Contains("plugin_convoyevent"))
  4944. {
  4945. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4946. {
  4947. chan.CreateMessage(Client, builder.Build());
  4948. });
  4949. }
  4950. }
  4951. }
  4952. }
  4953. #endregion
  4954.  
  4955. #region Harbor Event
  4956. void OnHarborEventStart()
  4957. {
  4958. if (_settings.OutputFormat.OutputTypeHarborEvent == "Simple")
  4959. {
  4960. var dict = new Dictionary<string, string>
  4961. {
  4962. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  4963. };
  4964. for (int i = 0; i < _channelCount; i++)
  4965. {
  4966. if (_settings.Channels[i].perms.Contains("plugin_harborevent"))
  4967. {
  4968.  
  4969. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4970. {
  4971. chan.CreateMessage(Client, Translate("PLUGIN_HarborEvent_Started", dict));
  4972. });
  4973. }
  4974. }
  4975. }
  4976. if (_settings.OutputFormat.OutputTypeHarborEvent == "Embed")
  4977. {
  4978. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  4979. .AddTitle("Harbor Event Plugin")
  4980. .AddUrl("https://lone.design/product/harborevent/")
  4981. .AddColor("#800080")
  4982. .AddDescription("Harbor Event has started.")
  4983. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  4984. .AddNowTimestamp()
  4985. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1010813485791326288/unknown.png");
  4986.  
  4987. for (int i = 0; i < _channelCount; i++)
  4988. {
  4989. if (_settings.Channels[i].perms.Contains("plugin_harborevent"))
  4990. {
  4991. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  4992. {
  4993. chan.CreateMessage(Client, builder.Build());
  4994. });
  4995. }
  4996. }
  4997. }
  4998. }
  4999. void OnHarborEventEnd(HashSet<BaseEntity> entities)
  5000. {
  5001. if (_settings.OutputFormat.OutputTypeHarborEvent == "Simple")
  5002. {
  5003. var dict = new Dictionary<string, string>
  5004. {
  5005. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  5006. };
  5007. for (int i = 0; i < _channelCount; i++)
  5008. {
  5009. if (_settings.Channels[i].perms.Contains("plugin_harborevent"))
  5010. {
  5011.  
  5012. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5013. {
  5014. chan.CreateMessage(Client, Translate("PLUGIN_HarborEvent_Ended", dict));
  5015. });
  5016. }
  5017. }
  5018. }
  5019. if (_settings.OutputFormat.OutputTypeHarborEvent == "Embed")
  5020. {
  5021. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  5022. .AddTitle("Harbor Event Plugin")
  5023. .AddUrl("https://lone.design/product/harborevent/")
  5024. .AddColor("#800080")
  5025. .AddDescription("Harbor Event has ended.")
  5026. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  5027. .AddNowTimestamp()
  5028. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1010813485791326288/unknown.png");
  5029.  
  5030. for (int i = 0; i < _channelCount; i++)
  5031. {
  5032. if (_settings.Channels[i].perms.Contains("plugin_harborevent"))
  5033. {
  5034. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5035. {
  5036. chan.CreateMessage(Client, builder.Build());
  5037. });
  5038. }
  5039. }
  5040. }
  5041. }
  5042. #endregion
  5043.  
  5044. #region Junkyard Event
  5045. void OnJunkyardEventStart()
  5046. {
  5047. if (_settings.OutputFormat.OutputTypeJunkyardEvent == "Simple")
  5048. {
  5049. var dict = new Dictionary<string, string>
  5050. {
  5051. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  5052. };
  5053. for (int i = 0; i < _channelCount; i++)
  5054. {
  5055. if (_settings.Channels[i].perms.Contains("plugin_junkyardevent"))
  5056. {
  5057.  
  5058. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5059. {
  5060. chan.CreateMessage(Client, Translate("PLUGIN_JunkyardEvent_Started", dict));
  5061. });
  5062. }
  5063. }
  5064. }
  5065. if (_settings.OutputFormat.OutputTypeJunkyardEvent == "Embed")
  5066. {
  5067. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  5068. .AddTitle("Junkyard Event Plugin")
  5069. .AddUrl("https://lone.design/product/junkyardevent-rust-plugin/")
  5070. .AddColor("#800080")
  5071. .AddDescription("Junkyard Event has started.")
  5072. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  5073. .AddNowTimestamp()
  5074. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1011142703939063868/unknown.png");
  5075.  
  5076. for (int i = 0; i < _channelCount; i++)
  5077. {
  5078. if (_settings.Channels[i].perms.Contains("plugin_junkyardevent"))
  5079. {
  5080. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5081. {
  5082. chan.CreateMessage(Client, builder.Build());
  5083. });
  5084. }
  5085. }
  5086. }
  5087. }
  5088. void OnJunkyardEventEnd(HashSet<BaseEntity> entities)
  5089. {
  5090. if (_settings.OutputFormat.OutputTypeJunkyardEvent == "Simple")
  5091. {
  5092. var dict = new Dictionary<string, string>
  5093. {
  5094. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  5095. };
  5096. for (int i = 0; i < _channelCount; i++)
  5097. {
  5098. if (_settings.Channels[i].perms.Contains("plugin_junkyardevent"))
  5099. {
  5100.  
  5101. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5102. {
  5103. chan.CreateMessage(Client, Translate("PLUGIN_JunkyardEvent_Ended", dict));
  5104. });
  5105. }
  5106. }
  5107. }
  5108. if (_settings.OutputFormat.OutputTypeJunkyardEvent == "Embed")
  5109. {
  5110. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  5111. .AddTitle("Junkyard Event Plugin")
  5112. .AddUrl("https://lone.design/product/junkyardevent-rust-plugin/")
  5113. .AddColor("#800080")
  5114. .AddDescription("Junkyard Event has ended.")
  5115. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  5116. .AddNowTimestamp()
  5117. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1011142703939063868/unknown.png");
  5118.  
  5119. for (int i = 0; i < _channelCount; i++)
  5120. {
  5121. if (_settings.Channels[i].perms.Contains("plugin_junkyardevent"))
  5122. {
  5123. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5124. {
  5125. chan.CreateMessage(Client, builder.Build());
  5126. });
  5127. }
  5128. }
  5129. }
  5130. }
  5131. #endregion
  5132.  
  5133. #region Power Plant Event
  5134. void OnPowerPlantEventStart()
  5135. {
  5136. if (_settings.OutputFormat.OutputTypePowerPlantEvent == "Simple")
  5137. {
  5138. var dict = new Dictionary<string, string>
  5139. {
  5140. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  5141. };
  5142. for (int i = 0; i < _channelCount; i++)
  5143. {
  5144. if (_settings.Channels[i].perms.Contains("plugin_powerplantevent"))
  5145. {
  5146.  
  5147. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5148. {
  5149. chan.CreateMessage(Client, Translate("PLUGIN_PowerPlantEvent_Started", dict));
  5150. });
  5151. }
  5152. }
  5153. }
  5154. if (_settings.OutputFormat.OutputTypePowerPlantEvent == "Embed")
  5155. {
  5156. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  5157. .AddTitle("Power Plant Event Plugin")
  5158. .AddUrl("https://lone.design/product/power-plant-event/")
  5159. .AddColor("#800080")
  5160. .AddDescription("Power Plant Event has started.")
  5161. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  5162. .AddNowTimestamp()
  5163. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1011144872826253372/unknown.png");
  5164.  
  5165. for (int i = 0; i < _channelCount; i++)
  5166. {
  5167. if (_settings.Channels[i].perms.Contains("plugin_powerplantevent"))
  5168. {
  5169. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5170. {
  5171. chan.CreateMessage(Client, builder.Build());
  5172. });
  5173. }
  5174. }
  5175. }
  5176. }
  5177. void OnPowerPlantEventEnd(HashSet<BaseEntity> entities)
  5178. {
  5179. if (_settings.OutputFormat.OutputTypePowerPlantEvent == "Simple")
  5180. {
  5181. var dict = new Dictionary<string, string>
  5182. {
  5183. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  5184. };
  5185. for (int i = 0; i < _channelCount; i++)
  5186. {
  5187. if (_settings.Channels[i].perms.Contains("plugin_powerplantevent"))
  5188. {
  5189.  
  5190. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5191. {
  5192. chan.CreateMessage(Client, Translate("PLUGIN_PowerPlantEvent_Ended", dict));
  5193. });
  5194. }
  5195. }
  5196. }
  5197. if (_settings.OutputFormat.OutputTypeJunkyardEvent == "Embed")
  5198. {
  5199. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  5200. .AddTitle("Power Plant Event Plugin")
  5201. .AddUrl("https://lone.design/product/power-plant-event/")
  5202. .AddColor("#800080")
  5203. .AddDescription("Power Plant Event has ended.")
  5204. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  5205. .AddNowTimestamp()
  5206. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1011144872826253372/unknown.png");
  5207.  
  5208. for (int i = 0; i < _channelCount; i++)
  5209. {
  5210. if (_settings.Channels[i].perms.Contains("plugin_powerplantevent"))
  5211. {
  5212. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5213. {
  5214. chan.CreateMessage(Client, builder.Build());
  5215. });
  5216. }
  5217. }
  5218. }
  5219. }
  5220. #endregion
  5221.  
  5222. #region Satellite Dish Event
  5223. void OnSatDishEventStart()
  5224. {
  5225. if (_settings.OutputFormat.OutputTypeSatDishEvent == "Simple")
  5226. {
  5227. var dict = new Dictionary<string, string>
  5228. {
  5229. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  5230. };
  5231. for (int i = 0; i < _channelCount; i++)
  5232. {
  5233. if (_settings.Channels[i].perms.Contains("plugin_satdishevent"))
  5234. {
  5235.  
  5236. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5237. {
  5238. chan.CreateMessage(Client, Translate("PLUGIN_SatDishEvent_Started", dict));
  5239. });
  5240. }
  5241. }
  5242. }
  5243. if (_settings.OutputFormat.OutputTypeSatDishEvent == "Embed")
  5244. {
  5245. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  5246. .AddTitle("Satellite Dish Event Plugin")
  5247. .AddUrl("https://lone.design/product/satdishevent/")
  5248. .AddColor("#800080")
  5249. .AddDescription("Satellite Dish Event has started.")
  5250. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  5251. .AddNowTimestamp()
  5252. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1011145882395213854/unknown.png");
  5253.  
  5254. for (int i = 0; i < _channelCount; i++)
  5255. {
  5256. if (_settings.Channels[i].perms.Contains("plugin_satdishevent"))
  5257. {
  5258. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5259. {
  5260. chan.CreateMessage(Client, builder.Build());
  5261. });
  5262. }
  5263. }
  5264. }
  5265. }
  5266. void OnSatDishEventEnd(HashSet<BaseEntity> entities)
  5267. {
  5268. if (_settings.OutputFormat.OutputTypeSatDishEvent == "Simple")
  5269. {
  5270. var dict = new Dictionary<string, string>
  5271. {
  5272. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  5273. };
  5274. for (int i = 0; i < _channelCount; i++)
  5275. {
  5276. if (_settings.Channels[i].perms.Contains("plugin_satdishevent"))
  5277. {
  5278.  
  5279. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5280. {
  5281. chan.CreateMessage(Client, Translate("PLUGIN_SatDishEvent_Ended", dict));
  5282. });
  5283. }
  5284. }
  5285. }
  5286. if (_settings.OutputFormat.OutputTypeSatDishEvent == "Embed")
  5287. {
  5288. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  5289. .AddTitle("Satellite Dish Event Plugin")
  5290. .AddUrl("https://lone.design/product/satdishevent/")
  5291. .AddColor("#800080")
  5292. .AddDescription("Satellite Dish Event has ended.")
  5293. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  5294. .AddNowTimestamp()
  5295. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1011145882395213854/unknown.png");
  5296.  
  5297. for (int i = 0; i < _channelCount; i++)
  5298. {
  5299. if (_settings.Channels[i].perms.Contains("plugin_satdishevent"))
  5300. {
  5301. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5302. {
  5303. chan.CreateMessage(Client, builder.Build());
  5304. });
  5305. }
  5306. }
  5307. }
  5308. }
  5309. #endregion
  5310.  
  5311. #region Sputnik Event
  5312. void OnSputnikEventStart()
  5313. {
  5314. if (_settings.OutputFormat.OutputTypeSputnikEvent == "Simple")
  5315. {
  5316. var dict = new Dictionary<string, string>
  5317. {
  5318. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  5319. };
  5320. for (int i = 0; i < _channelCount; i++)
  5321. {
  5322. if (_settings.Channels[i].perms.Contains("plugin_sputnikevent"))
  5323. {
  5324.  
  5325. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5326. {
  5327. chan.CreateMessage(Client, Translate("PLUGIN_SputnikEvent_Started", dict));
  5328. });
  5329. }
  5330. }
  5331. }
  5332. if (_settings.OutputFormat.OutputTypeSputnikEvent == "Embed")
  5333. {
  5334. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  5335. .AddTitle("Sputnik Event Plugin")
  5336. .AddUrl("https://lone.design/product/sputnik/")
  5337. .AddColor("#800080")
  5338. .AddDescription("Sputnik Event has started.")
  5339. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  5340. .AddNowTimestamp()
  5341. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1011495773936037888/unknown.png");
  5342.  
  5343. for (int i = 0; i < _channelCount; i++)
  5344. {
  5345. if (_settings.Channels[i].perms.Contains("plugin_sputnikevent"))
  5346. {
  5347. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5348. {
  5349. chan.CreateMessage(Client, builder.Build());
  5350. });
  5351. }
  5352. }
  5353. }
  5354. }
  5355. void OnSputnikEventStop()
  5356. {
  5357. if (_settings.OutputFormat.OutputTypeSputnikEvent == "Simple")
  5358. {
  5359. var dict = new Dictionary<string, string>
  5360. {
  5361. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  5362. };
  5363. for (int i = 0; i < _channelCount; i++)
  5364. {
  5365. if (_settings.Channels[i].perms.Contains("plugin_sputnikevent"))
  5366. {
  5367.  
  5368. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5369. {
  5370. chan.CreateMessage(Client, Translate("PLUGIN_SputnikEvent_Ended", dict));
  5371. });
  5372. }
  5373. }
  5374. }
  5375. if (_settings.OutputFormat.OutputTypeSputnikEvent == "Embed")
  5376. {
  5377. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  5378. .AddTitle("Sputnik Event Plugin")
  5379. .AddUrl("https://lone.design/product/sputnik/")
  5380. .AddColor("#800080")
  5381. .AddDescription("Sputnik Event has ended.")
  5382. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  5383. .AddNowTimestamp()
  5384. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1011495773936037888/unknown.png");
  5385.  
  5386. for (int i = 0; i < _channelCount; i++)
  5387. {
  5388. if (_settings.Channels[i].perms.Contains("plugin_sputnikevent"))
  5389. {
  5390. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5391. {
  5392. chan.CreateMessage(Client, builder.Build());
  5393. });
  5394. }
  5395. }
  5396. }
  5397. }
  5398. #endregion
  5399.  
  5400. #region Water Event
  5401. void OnWaterEventStart()
  5402. {
  5403. if (_settings.OutputFormat.OutputTypeWaterEvent == "Simple")
  5404. {
  5405. var dict = new Dictionary<string, string>
  5406. {
  5407. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  5408. };
  5409. for (int i = 0; i < _channelCount; i++)
  5410. {
  5411. if (_settings.Channels[i].perms.Contains("plugin_waterevent"))
  5412. {
  5413.  
  5414. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5415. {
  5416. chan.CreateMessage(Client, Translate("PLUGIN_WaterEvent_Started", dict));
  5417. });
  5418. }
  5419. }
  5420. }
  5421. if (_settings.OutputFormat.OutputTypeWaterEvent == "Embed")
  5422. {
  5423. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  5424. .AddTitle("Water Event Plugin")
  5425. .AddUrl("https://lone.design/product/waterevent/")
  5426. .AddColor("#800080")
  5427. .AddDescription("Water Event has started.")
  5428. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  5429. .AddNowTimestamp()
  5430. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1011166741310754836/unknown.png");
  5431.  
  5432. for (int i = 0; i < _channelCount; i++)
  5433. {
  5434. if (_settings.Channels[i].perms.Contains("plugin_waterevent"))
  5435. {
  5436. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5437. {
  5438. chan.CreateMessage(Client, builder.Build());
  5439. });
  5440. }
  5441. }
  5442. }
  5443. }
  5444. void OnWaterEventEnd(HashSet<BaseEntity> entities)
  5445. {
  5446. if (_settings.OutputFormat.OutputTypeWaterEvent == "Simple")
  5447. {
  5448. var dict = new Dictionary<string, string>
  5449. {
  5450. { "time", DateTimeOffset.UtcNow.DateTime.ToLocalTime().ToString("hh:mm tt")}
  5451. };
  5452. for (int i = 0; i < _channelCount; i++)
  5453. {
  5454. if (_settings.Channels[i].perms.Contains("plugin_waterevent"))
  5455. {
  5456.  
  5457. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5458. {
  5459. chan.CreateMessage(Client, Translate("PLUGIN_WaterEvent_Ended", dict));
  5460. });
  5461. }
  5462. }
  5463. }
  5464. if (_settings.OutputFormat.OutputTypeWaterEvent == "Embed")
  5465. {
  5466. DiscordEmbedBuilder builder = new DiscordEmbedBuilder()
  5467. .AddTitle("Water Event Plugin")
  5468. .AddUrl("https://lone.design/product/waterevent/")
  5469. .AddColor("#800080")
  5470. .AddDescription("Water Event has ended.")
  5471. .AddFooter($"Rustcord {this.Version}", "https://media.discordapp.net/attachments/571482804475527168/1010803785632841768/unknown.png")
  5472. .AddNowTimestamp()
  5473. .AddThumbnail("https://media.discordapp.net/attachments/571482804475527168/1011166741310754836/unknown.png");
  5474.  
  5475. for (int i = 0; i < _channelCount; i++)
  5476. {
  5477. if (_settings.Channels[i].perms.Contains("plugin_waterevent"))
  5478. {
  5479. GetChannel(Client, _settings.Channels[i].Channelid, chan =>
  5480. {
  5481. chan.CreateMessage(Client, builder.Build());
  5482. });
  5483. }
  5484. }
  5485. }
  5486. }
  5487. #endregion
  5488.  
  5489. #endregion
  5490. }
  5491. }
Advertisement
Comments
  • User was banned
Add Comment
Please, Sign In to add comment