private Task Discord_MessageCreated(DSharpPlus.EventArgs.MessageCreateEventArgs e)
        {
            if (!e.Author.IsBot)
            {
                //execute commands
                if (e.Channel.Id.Equals(ulong.Parse(Plugin.Config.CommandChannelId)) && e.Message.Content.StartsWith(Plugin.Config.CommandPrefix))
                {
                    string cmd     = e.Message.Content.Substring(Plugin.Config.CommandPrefix.Length);
                    var    cmdText = new string(cmd.Skip(1).ToArray());

                    if (Plugin.Torch.CurrentSession?.State == TorchSessionState.Loaded)
                    {
                        var manager = Plugin.Torch.CurrentSession.Managers.GetManager <CommandManager>();
                        var command = manager.Commands.GetCommand(cmdText, out string argText);

                        if (command == null)
                        {
                            SendCmdResponse("Command not found: " + cmdText, e.Channel);
                        }
                        else
                        {
                            var cmdPath   = string.Join(".", command.Path);
                            var splitArgs = Regex.Matches(argText, "(\"[^\"]+\"|\\S+)").Cast <Match>().Select(x => x.ToString().Replace("\"", "")).ToList();
                            SEDiscordBridgePlugin.Log.Trace($"Invoking {cmdPath} for server.");

                            var context = new SEDBCommandHandler(Plugin.Torch, command.Plugin, Sync.MyId, argText, splitArgs);
                            context.ResponeChannel = e.Channel;
                            context.OnResponse    += OnCommandResponse;
                            var invokeSuccess = false;
                            Plugin.Torch.InvokeBlocking(() => invokeSuccess = command.TryInvoke(context));
                            SEDiscordBridgePlugin.Log.Debug($"invokeSuccess {invokeSuccess}");
                            if (!invokeSuccess)
                            {
                                SendCmdResponse("Error executing command: " + cmdText, e.Channel);
                            }
                            SEDiscordBridgePlugin.Log.Info($"Server ran command '{string.Join(" ", cmdText)}'");
                        }
                    }
                    else
                    {
                        SendCmdResponse("Error: Server is not running.", e.Channel);
                    }
                    return(Task.CompletedTask);
                }

                //send to global
                if (e.Channel.Id.Equals(ulong.Parse(Plugin.Config.ChatChannelId)))
                {
                    string sender = Plugin.Config.ServerName;

                    if (!Plugin.Config.AsServer)
                    {
                        if (Plugin.Config.UseNicks)
                        {
                            sender = e.Guild.GetMemberAsync(e.Author.Id).Result.Nickname;
                        }
                        else
                        {
                            sender = e.Author.Username;
                        }
                    }

                    var manager = Plugin.Torch.CurrentSession.Managers.GetManager <IChatManagerServer>();
                    var dSender = Plugin.Config.Format2.Replace("{p}", sender);
                    var msg     = MentionIDToName(e.Message);
                    lastMessage = dSender + msg;
                    manager.SendMessageAsOther(dSender, msg,
                                               typeof(MyFontEnum).GetFields().Select(x => x.Name).Where(x => x.Equals(Plugin.Config.GlobalColor)).First());
                }

                //send to faction
                IEnumerable <string> channelIds = Plugin.Config.FactionChannels.Where(c => e.Channel.Id.Equals(ulong.Parse(c.Split(':')[1])));
                if (channelIds.Count() > 0)
                {
                    foreach (string chId in channelIds)
                    {
                        IEnumerable <IMyFaction> facs = MySession.Static.Factions.Factions.Values.Where(f => f.Name.Equals(chId.Split(':')[0]));
                        if (facs.Count() > 0)
                        {
                            IMyFaction fac = facs.First();
                            foreach (MyFactionMember mb in fac.Members.Values)
                            {
                                if (!MySession.Static.Players.GetOnlinePlayers().Any(p => p.Identity.IdentityId.Equals(mb.PlayerId)))
                                {
                                    continue;
                                }

                                ulong  steamid = MySession.Static.Players.TryGetSteamId(mb.PlayerId);
                                string sender  = Plugin.Config.ServerName;
                                if (!Plugin.Config.AsServer)
                                {
                                    if (Plugin.Config.UseNicks)
                                    {
                                        sender = e.Guild.GetMemberAsync(e.Author.Id).Result.Nickname;
                                    }
                                    else
                                    {
                                        sender = e.Author.Username;
                                    }
                                }
                                var manager = Plugin.Torch.CurrentSession.Managers.GetManager <IChatManagerServer>();
                                var dSender = Plugin.Config.Format2.Replace("{p}", sender);
                                var msg     = MentionIDToName(e.Message);
                                lastMessage = dSender + msg;
                                manager.SendMessageAsOther(dSender, msg,
                                                           typeof(MyFontEnum).GetFields().Select(x => x.Name).Where(x => x.Equals(Plugin.Config.FacColor)).First(), steamid);
                            }
                        }
                    }
                }
            }
            return(Task.CompletedTask);
        }
        private Task Discord_MessageCreated(DiscordClient discord, DSharpPlus.EventArgs.MessageCreateEventArgs e)
        {
            bool    cmdConditionMatch = false;
            dynamic cmdPrefixes       = Plugin.Config.CommandPrefix;
            string  matchedPrefix     = "";

            cmdPrefixes = cmdPrefixes.Split();

            if (!e.Author.IsBot || (!botId.Equals(e.Author.Id) && Plugin.Config.BotToGame))
            {
                string comChannelId = Plugin.Config.CommandChannelId;
                if (!string.IsNullOrEmpty(comChannelId))
                {
                    foreach (string prefix in cmdPrefixes)
                    {
                        if (Plugin.Config.CommandChannelId.Contains(e.Channel.Id.ToString()) && e.Message.Content.StartsWith(prefix))
                        {
                            cmdConditionMatch = true;
                            matchedPrefix     = prefix;
                        }
                    }
                    //execute commands
                    if (cmdConditionMatch)
                    {
                        var cmdArgs = e.Message.Content.Substring(matchedPrefix.Length);
                        var cmd     = cmdArgs.Split(' ')[0];

                        // Check for permission
                        if (Plugin.Config.CommandPerms.Count() > 0)
                        {
                            var  userId      = e.Author.Id.ToString();
                            bool hasRolePerm = e.Guild.GetMemberAsync(e.Author.Id).Result.Roles.Where(r => Plugin.Config.CommandPerms.Where(c => c.Split(':')[0].Equals(r.Id.ToString())).Any()).Any();

                            if (Plugin.Config.CommandPerms.Where(c =>
                            {
                                if (!hasRolePerm && !c.Split(':')[0].Equals(userId))
                                {
                                    return(true);
                                }
                                else
                                if ((c.Split(':')[0].Equals(userId) || hasRolePerm) && (c.Split(':')[1].Equals(cmd) || c.Split(':')[1].Equals("*")))
                                {
                                    return(false);
                                }

                                return(true);
                            }).Any())
                            {
                                SendCmdResponse($"No permission for command: {cmd}", e.Channel, DiscordColor.Red, cmd);
                                return(Task.CompletedTask);
                            }
                        }

                        if (Plugin.Torch.CurrentSession?.State == TorchSessionState.Loaded)
                        {
                            var manager = Plugin.Torch.CurrentSession.Managers.GetManager <CommandManager>();
                            var command = manager.Commands.GetCommand(cmdArgs, out string argText);

                            if (command == null)
                            {
                                SendCmdResponse($"Command not found: {cmdArgs}", e.Channel, DiscordColor.Red, cmd);
                            }
                            else
                            {
                                var cmdPath   = string.Join(".", command.Path);
                                var splitArgs = Regex.Matches(argText, "(\"[^\"]+\"|\\S+)").Cast <Match>().Select(x => x.ToString().Replace("\"", "")).ToList();
                                SEDiscordBridgePlugin.Log.Trace($"Invoking {cmdPath} for server.");

                                var context = new SEDBCommandHandler(Plugin.Torch, command.Plugin, Sync.MyId, argText, splitArgs);
                                context.ResponeChannel = e.Channel;
                                context.OnResponse    += OnCommandResponse;
                                var invokeSuccess = false;
                                Plugin.Torch.InvokeBlocking(() => invokeSuccess = command.TryInvoke(context));
                                SEDiscordBridgePlugin.Log.Debug($"invokeSuccess {invokeSuccess}");
                                if (!invokeSuccess)
                                {
                                    SendCmdResponse($"Error executing command: {cmdArgs}", e.Channel, DiscordColor.Red, cmd);
                                }
                                SEDiscordBridgePlugin.Log.Info($"Server ran command '{cmdArgs}'");
                            }
                        }
                        else
                        {
                            SendCmdResponse("Error: Server is not running.", e.Channel, DiscordColor.Red, cmd);
                        }
                        return(Task.CompletedTask);
                    }
                }

                //send to global
                if (Plugin.Config.ChatChannelId.Contains(e.Channel.Id.ToString()))
                {
                    string sender = Plugin.Config.ServerName;

                    if (!Plugin.Config.AsServer)
                    {
                        if (Plugin.Config.UseNicks)
                        {
                            sender = e.Guild.GetMemberAsync(e.Author.Id).Result.Nickname;
                        }
                        else
                        {
                            sender = e.Guild.GetMemberAsync(e.Author.Id).Result.Username;
                        }
                    }

                    var manager = Plugin.Torch.CurrentSession.Managers.GetManager <IChatManagerServer>();
                    var dSender = Plugin.Config.Format2.Replace("{p}", sender);
                    var msg     = MentionIDToName(e.Message);
                    lastMessage = dSender + msg;
                    manager.SendMessageAsOther(dSender, msg,
                                               typeof(MyFontEnum).GetFields().Select(x => x.Name).Where(x => x.Equals(Plugin.Config.GlobalColor)).First());
                }

                //send to faction
                IEnumerable <string> channelIds = Plugin.Config.FactionChannels.Where(c => e.Channel.Id.Equals(ulong.Parse(c.Split(':')[1])));
                if (channelIds.Count() > 0)
                {
                    foreach (string chId in channelIds)
                    {
                        IEnumerable <IMyFaction> facs = MySession.Static.Factions.Factions.Values.Where(f => f.Name.Equals(chId.Split(':')[0]));
                        if (facs.Count() > 0)
                        {
                            IMyFaction fac = facs.First();
                            foreach (MyFactionMember mb in fac.Members.Values)
                            {
                                if (!MySession.Static.Players.GetOnlinePlayers().Any(p => p.Identity.IdentityId.Equals(mb.PlayerId)))
                                {
                                    continue;
                                }

                                ulong  steamid = MySession.Static.Players.TryGetSteamId(mb.PlayerId);
                                string sender  = Plugin.Config.ServerName;
                                if (!Plugin.Config.AsServer)
                                {
                                    if (Plugin.Config.UseNicks)
                                    {
                                        sender = e.Guild.GetMemberAsync(e.Author.Id).Result.Nickname;
                                    }
                                    else
                                    {
                                        sender = e.Author.Username;
                                    }
                                }
                                var manager = Plugin.Torch.CurrentSession.Managers.GetManager <IChatManagerServer>();
                                var dSender = Plugin.Config.FacFormat2.Replace("{p}", sender);
                                var msg     = MentionIDToName(e.Message);
                                lastMessage = dSender + msg;
                                manager.SendMessageAsOther(dSender, msg,
                                                           typeof(MyFontEnum).GetFields().Select(x => x.Name).Where(x => x.Equals(Plugin.Config.FacColor)).First(), steamid);
                            }
                        }
                    }
                }
            }
            return(Task.CompletedTask);
        }