コード例 #1
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
        private void TakeWhisper(Pacote pacote, IPAddress requester)
        {
            if (!(getAction(pacote.action) == Action.whisper))
            {
                throw new Exception("Action inválida para whisper (Action recebida: \"" + pacote.action + "\")");
            }

            BackgroundWorker bw = new BackgroundWorker();

            bw.DoWork += (sender, e) =>
            {
                if (String.IsNullOrEmpty(pacote.nickname))
                {
                    pacote.nickname = this.amigos.Single(x => x.address == requester.ToString()).nickname;
                }
            };
            bw.RunWorkerCompleted += (sender, e) =>
            {
                OnTakeWhisper(pacote);
            };
            bw.RunWorkerAsync();
        }
コード例 #2
0
        public Pacote(byte[] msg)
        {
            users = new List <Amigo>();

            JSON ser = new JSON(typeof(Pacote));

            using (var ms = new MemoryStream(msg))
            {
                Pacote novo = (Pacote)ser.ReadObject(ms);

                if (novo.action.ToLower() == "KEEPALIVE")
                {
                    this.action = "";
                }

                this.action   = novo.action.ToLower();
                this.content  = novo.content;
                this.message  = novo.message;
                this.nickname = novo.nickname;
                this.target   = novo.target;
                this.users    = novo.users;
            }
        }
コード例 #3
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
        private void TakeLeave(Pacote pacote, IPAddress requester)
        {
            if (!(getAction(pacote.action) == Action.leave))
            {
                throw new Exception("Action inválida para leave (Action recebida: \"" + pacote.action + "\")");
            }

            if (this.amigos == null)
            {
                throw new Exception("Lista de amigos não definida");
            }
            if (this.amigos.Count == 0)
            {
                return;
            }

            Amigo quemSaiu = null;

            BackgroundWorker bw = new BackgroundWorker();

            bw.DoWork += (sender, e) =>
            {
                quemSaiu = amigos.Single(c => c.address == requester.ToString() && c.nickname == pacote.nickname);
                if (quemSaiu != null)
                {
                    amigos.Remove(quemSaiu);
                }
            };
            bw.RunWorkerCompleted += (sender, e) =>
            {
                if (quemSaiu != null)
                {
                    OnTakeLeave(quemSaiu);
                }
            };
            bw.RunWorkerAsync();
        }
コード例 #4
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
        private void MakeWhisper(string texto)
        {
            if (this.amigos == null)
            {
                throw new Exception("Lista de amigos não definida");
            }
            if (this.amigos.Count == 0)
            {
                throw new Exception("Cliente sem amigos");
            }
            if (!(this.amigos.Any(c => c.confident)))
            {
                throw new Exception("Você não tem confidentes, selecione-os na sua lista de amigos");
            }

            Pacote pacote = new Pacote();

            BackgroundWorker bw = new BackgroundWorker();

            bw.DoWork += (sender, e) =>
            {
                foreach (Amigo amigo in amigos)
                {
                    if (amigo.confident)
                    {
                        pacote = new Pacote(Action.whisper, amigo.address, this.name, texto);
                        PacoteEnviar(pacote);
                    }
                }
            };
            bw.RunWorkerCompleted += (sender, e) =>
            {
                OnMakeWhisper(pacote);
            };
            bw.RunWorkerAsync();
        }
コード例 #5
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
        private void TakeKeepAlive(Pacote pacote, IPAddress requester)
        {
            if (!(getAction(pacote.action) == Action.keepalive))
                throw new Exception("Action inválida para keepalive (Action recebida: \"" + pacote.action + "\")");

            Amigo keepTaked = null;

            string dest = null;
            string erro = null;

            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += (sender, e) =>
                {
                    if (this.amigos.Count == 0)
                        amigos.Add(new Amigo(requester, pacote.nickname));
                    else
                    {
                        foreach (Amigo amigo in amigos)
                        {
                            //Algum amigo meu tem esse ip?
                            if (amigo.address == requester.ToString())
                            {
                                //Esse amigo tem esse nickname? Se sim atualizar o timestamp dele.
                                if (amigo.nickname == pacote.nickname)
                                {
                                    amigo.timestamp = DateTime.Now;
                                    keepTaked = amigo;
                                    return;
                                }
                                else
                                {
                                    dest = amigo.address;
                                    erro = "Você mandou um keepalive, mas teu nickname era outro, atualizei aqui de \"" + amigo.nickname + "\" para \"" + pacote.nickname + "\".";
                                    return;
                                }
                            }
                        }

                        dest = requester.ToString();
                        erro = "Você mandou um keepalive mas estava fora da minha lista de amigos, verfique o tempo que você leva para enviar keepalive";
                        amigos.Add(new Amigo(requester, pacote.nickname));
                    }
                };
             bw.RunWorkerCompleted += (sender, e) =>
                {
                    ControleDeAmigos(pacote);

                    if (dest != null)
                        Report(dest, erro);

                    if (keepTaked != null)
                        OnTakeKeepAlive(keepTaked);
                };
             bw.RunWorkerAsync();
        }
コード例 #6
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
        private void PacoteLer(IAsyncResult e)
        {
            try
            {
                Pacote pacote = new Pacote(sock.EndReceive(e, ref endP));

            #if !CHAT_RECURSIVO
                //Não peguei meu próprio pacote (O IPv4 de saída do pacote é igual ao meu? Se sim, fui eu mesmo que mandei)
                if (endP.Address.ToString() != ipv4)
                {
            #endif
                    switch (getAction(pacote.action))
                    {
                        case Action.keepalive:
                            TakeKeepAlive(pacote, endP.Address);
                            break;
                        case Action.leave:
                            TakeLeave(pacote, endP.Address);
                            break;
                        case Action.report:
                            TakeReport(pacote, endP.Address);
                            break;
                        case Action.say:
                            TakeSay(pacote, endP.Address);
                            break;
                        case Action.search:
                            TakeSearch(pacote, endP.Address);
                            break;
                        case Action.whisper:
                            TakeWhisper(pacote, endP.Address);
                            break;
                        case Action.erro:
                            Report(endP.Address.ToString(), String.Format("?[{0}]? - Action não recohecida", pacote.action));
                            break;

                    }
            #if !CHAT_RECURSIVO
                }
            #endif
                if (CHAT_ABERTO)
                    PacoteRecebido();
                else
                    sock.Close();
            }
            catch
            {

            }
        }
コード例 #7
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
 private void PacoteEnviar(Pacote pacote)
 {
     if(pacote.target != "127.0.0.1")
         sock.Send(pacote.ToByte(), pacote.Length(), new IPEndPoint(IPAddress.Parse(pacote.target), port));
 }
コード例 #8
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
        private void MakeWhisper(string texto)
        {
            if (this.amigos == null)
                throw new Exception("Lista de amigos não definida");
            if (this.amigos.Count == 0)
                throw new Exception("Cliente sem amigos");
            if (!(this.amigos.Any(c => c.confident)))
                throw new Exception("Você não tem confidentes, selecione-os na sua lista de amigos");

            Pacote pacote = new Pacote();

            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += (sender, e) =>
            {
                foreach (Amigo amigo in amigos)
                {
                    if (amigo.confident)
                    {
                        pacote = new Pacote(Action.whisper, amigo.address, this.name, texto);
                        PacoteEnviar(pacote);
                    }
                }
            };
            bw.RunWorkerCompleted += (sender, e) =>
            {
                OnMakeWhisper(pacote);
            };
            bw.RunWorkerAsync();
        }
コード例 #9
0
        public void OnTakeReport(object sender, EventArgs e)
        {
            Pacote pacote = (Pacote)sender;

            PrintLog(Maked.take, Action.report, pacote.nickname, "Erro Recebido, message => " + pacote.message);
        }
コード例 #10
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
        private void TakeSearch(Pacote pacote, IPAddress requester)
        {
            if (!(getAction(pacote.action) == Action.search))
                throw new Exception("Action inválida para search (Action recebida: \"" + pacote.action + "\")");

            string dest = null;
            string erro = null;

            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += (sender, e) =>
                {
                    if (amigos.Count != 0)
                        foreach (Amigo amigo in amigos)
                        {
                            //Algum amigo meu tem esse ip? Se sim atualizar o nickname dele.
                            if (amigo.address == requester.ToString())
                            {
                                dest = amigo.address;
                                erro = "Você já está na minha lista, atualizei teu nickname de \"" + amigo.nickname + "\" para \"" + pacote.nickname + "\".";
                                break;
                            }

                            //Algum amigo meu tem esse nickname? Se sim reporto nickname duplicado.
                            if (amigo.nickname == pacote.nickname)
                            {
                                dest = requester.ToString();
                                erro = "Esse nickname já está presente na minha lista, tente outro.";
                                break;
                            }
                        }

                };
            bw.RunWorkerCompleted += (sender, e) =>
                {
                    if (dest != null)
                    {
                        Report(dest, erro);
                        return;
                    }

                    Amigo novo = new Amigo(requester, pacote.nickname);
                    amigos.Add(novo);

                    if (novo != null)
                        OnTakeSearch(novo);
                };
            bw.RunWorkerAsync();
        }
コード例 #11
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
 public virtual void OnTakeWhisper(Pacote pacote)
 {
     if (WhisperTake != null)
         WhisperTake(pacote, new EventArgs());
 }
コード例 #12
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
 public virtual void OnTakeSay(Pacote pacote)
 {
     if (SayTake != null)
         SayTake(pacote, new EventArgs());
 }
コード例 #13
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
 public virtual void OnTakeReport(Pacote pacote)
 {
     if (ReportTake != null)
         ReportTake(pacote, new EventArgs());
 }
コード例 #14
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
        private void TakeLeave(Pacote pacote, IPAddress requester)
        {
            if (!(getAction(pacote.action) == Action.leave))
                throw new Exception("Action inválida para leave (Action recebida: \"" + pacote.action + "\")");

            if (this.amigos == null)
                throw new Exception("Lista de amigos não definida");
            if (this.amigos.Count == 0)
                return;

            Amigo quemSaiu = null;

            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += (sender, e) =>
            {
                quemSaiu = amigos.Single(c => c.address == requester.ToString() && c.nickname == pacote.nickname);
                if (quemSaiu != null)
                    amigos.Remove(quemSaiu);
            };
            bw.RunWorkerCompleted += (sender, e) =>
            {
                if (quemSaiu != null)
                    OnTakeLeave(quemSaiu);
            };
            bw.RunWorkerAsync();
        }
コード例 #15
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
 private void ControleDeAmigos(Pacote pacote)
 {
     List<Amigo> amigosAtuais = pacote.users;
     if (pacote.users != null) //O cara tem amigos?
         foreach (Amigo amigoDoAmigo in amigosAtuais) //Quem são os amigos
             if (amigoDoAmigo.address != this.ipv4) //Esse amigo... sou eu?
                 if (!amigos.Any(x => x.address == amigoDoAmigo.address)) //Eu conheço?
                     amigos.Add(new Amigo(amigoDoAmigo.address, amigoDoAmigo.nickname)); //Então me apresente
     pacote.users = amigosAtuais;
 }
コード例 #16
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
        private void TakeReport(Pacote pacote, IPAddress requester)
        {
            if (!(getAction(pacote.action) == Action.report))
                throw new Exception("Action inválida para Report (Action recebida: \"" + pacote.action + "\")");

            if (this.amigos == null)
                throw new Exception("Lista de amigos não definida");
            if (this.amigos.Count == 0)
            {
                amigos.Add(new Amigo(requester, pacote.nickname));
            }

            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += (sender, e) =>
            {
                if (String.IsNullOrEmpty(pacote.nickname))
                    pacote.nickname = this.amigos.Single(x => x.address == requester.ToString()).nickname;
            };
            bw.RunWorkerCompleted += (sender, e) =>
            {
                OnTakeReport(pacote);
            };
            bw.RunWorkerAsync();
        }
コード例 #17
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
        private void MakeReport(string taget, string texto)
        {
            if (this.amigos == null)
                throw new Exception("Lista de amigos não definida");
            if (this.amigos.Count == 0)
                throw new Exception("Cliente sem amigos");

            Pacote pacote = new Pacote(Action.report);
            pacote.message = texto;
            pacote.nickname = this.name;
            pacote.target = taget;

            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += (sender, e) =>
            {
                PacoteEnviar(pacote);
            };
            bw.RunWorkerCompleted += (sender, e) =>
            {
                OnMakeReport(pacote);
            };
            bw.RunWorkerAsync();
        }
コード例 #18
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
        private void TakeWhisper(Pacote pacote, IPAddress requester)
        {
            if (!(getAction(pacote.action) == Action.whisper))
                throw new Exception("Action inválida para whisper (Action recebida: \"" + pacote.action + "\")");

            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += (sender, e) =>
            {
                if (String.IsNullOrEmpty(pacote.nickname))
                    pacote.nickname = this.amigos.Single(x => x.address == requester.ToString()).nickname;
            };
            bw.RunWorkerCompleted += (sender, e) =>
            {
                OnTakeWhisper(pacote);
            };
            bw.RunWorkerAsync();
        }
コード例 #19
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
        private void MakeSay(string texto)
        {
            if (this.amigos == null)
                throw new Exception("Lista de amigos não definida");
            if (this.amigos.Count == 0)
                throw new Exception("Cliente sem amigos");

            Pacote pacote = new Pacote();

            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += (sender, e) =>
            {
                pacote = new Pacote(Action.say, "", this.name, texto);
                foreach (Amigo amigo in amigos)
                {
                    pacote.target = amigo.address;
                    PacoteEnviar(pacote);
                }
            };
            bw.RunWorkerCompleted += (sender, e) =>
            {
                OnMakeSay(pacote);
            };
            bw.RunWorkerAsync();
        }
コード例 #20
0
        public void OnMakeReport(object sender, EventArgs e)
        {
            Pacote pacote = (Pacote)sender;

            PrintLog(Maked.make, Action.report, "Eu mesmo", "Erro Enviado, message => " + pacote.message);
        }
コード例 #21
0
ファイル: Conversa.cs プロジェクト: andbreder/Chat_C-
        private void TakeKeepAlive(Pacote pacote, IPAddress requester)
        {
            if (!(getAction(pacote.action) == Action.keepalive))
            {
                throw new Exception("Action inválida para keepalive (Action recebida: \"" + pacote.action + "\")");
            }

            Amigo keepTaked = null;

            string dest = null;
            string erro = null;

            BackgroundWorker bw = new BackgroundWorker();

            bw.DoWork += (sender, e) =>
            {
                if (this.amigos.Count == 0)
                {
                    amigos.Add(new Amigo(requester, pacote.nickname));
                }
                else
                {
                    foreach (Amigo amigo in amigos)
                    {
                        //Algum amigo meu tem esse ip?
                        if (amigo.address == requester.ToString())
                        {
                            //Esse amigo tem esse nickname? Se sim atualizar o timestamp dele.
                            if (amigo.nickname == pacote.nickname)
                            {
                                amigo.timestamp = DateTime.Now;
                                keepTaked       = amigo;
                                return;
                            }
                            else
                            {
                                dest = amigo.address;
                                erro = "Você mandou um keepalive, mas teu nickname era outro, atualizei aqui de \"" + amigo.nickname + "\" para \"" + pacote.nickname + "\".";
                                return;
                            }
                        }
                    }

                    dest = requester.ToString();
                    erro = "Você mandou um keepalive mas estava fora da minha lista de amigos, verfique o tempo que você leva para enviar keepalive";
                    amigos.Add(new Amigo(requester, pacote.nickname));
                }
            };
            bw.RunWorkerCompleted += (sender, e) =>
            {
                ControleDeAmigos(pacote);

                if (dest != null)
                {
                    Report(dest, erro);
                }

                if (keepTaked != null)
                {
                    OnTakeKeepAlive(keepTaked);
                }
            };
            bw.RunWorkerAsync();
        }