示例#1
0
        private async Task DeleteClient(ConnectedClient client)
        {
            await mutex.WaitAsync();

            ServerChatMessage sm = null;

            try
            {
                clients.Remove(client);

                var st = new Status();
                st.DeleteClient = client.Username;
                st.CurrentClients.Add(clients.Select(x => x.Username).ToList());

                sm        = new ServerChatMessage();
                sm.Status = st;

                logger.Info($"DeleteClient: Username='******'");
            }
            catch (Exception ex)
            {
                logger.Error(ex, $"!!! DeleteClient Exception: Username='******' !!! {ex.Message}");
                sm = null;
            }
            finally
            {
                mutex.Release();
            }

            if (sm != null)
            {
                await Broadcast(sm);
            }
        }
示例#2
0
        private async Task Broadcast(ChatMessage cm)
        {
            var sm = new ServerChatMessage()
            {
                Message = cm
            };

            await Broadcast(sm);
        }
示例#3
0
        private void Process(ServerChatMessage sm)
        {
            if (sm.Status != null)
            {
                Process(sm.Status);
            }

            if (sm.Message != null)
            {
                Process(sm.Message);
            }
        }
示例#4
0
 /// <summary>
 /// Called when a chat message is sent
 /// </summary>
 /// <param name="console">The server GUI - provides access to the underlying server process</param>
 /// <param name="message">The chat message</param>
 public void OnChatMessage(IServerConsole console, ServerChatMessage message)
 {
     foreach (IPlugin plugin in Enabled)
     {
         try
         {
             plugin.OnChatMessage(console, message);
         }
         catch (Exception ex)
         {
             console.DisplayLine($"Error in method OnChatMessage for plugin {plugin.Name}: {ex}", red);
         }
     }
 }
示例#5
0
        private async Task Broadcast(ServerChatMessage sm)
        {
            await mutex.WaitAsync();

            var sw = System.Diagnostics.Stopwatch.StartNew();

            Task tasks = null;

            try
            {
                var taskList = clients.Select(c =>
                                              Task.Run(async() =>
                {
                    try
                    {
                        await c.ChatWriter.WriteAsync(sm);
                    }
                    catch (Exception ex)
                    {
                        ex.Data.Add("ClientObject", c);
                        ex.Data.Add("Username", c?.Username);
                        ex.Data.Add("Guid", c?.Guid);
                        throw;
                    }
                }));

                tasks = Task.WhenAll(taskList);

                await tasks;



                logger.Info($"Broadcast: {(sm.Message != null ? "ChatMessage" : string.Empty)} {(sm.Status != null ? "Status" : string.Empty)} ClientCount={clients.Count} Elapsed={sw.Elapsed:G}");
            }
            catch (Exception ex)
            {
                logger.Error($"!!! Broadcast Exception: {ex.Message}");

                tasks?.Exception?.Handle(ex =>
                {
                    logger.Error(ex, $"!!! Broadcast Exception: Username='******' !!! {ex.Message}");
                    return(true);
                });
            }
            finally
            {
                mutex.Release();
            }
        }
        protected override void InternalParse()
        {
            m_message = new ServerChatMessage(this.Reader, (WowOpcodes)this.Packet.Opcode);

            Output.Append(m_message.ToString());
        }
示例#7
0
 public void OnChatMessage(IServerConsole console, ServerChatMessage message)
 {
     chatMessages.AddLast(message);
 }
示例#8
0
 public void OnChatMessage(IServerConsole console, ServerChatMessage message)
 {
 }