예제 #1
0
        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();
        }
예제 #2
0
        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();
        }
예제 #3
0
        private void OnTakeKeepAlive(object sender, EventArgs e)
        {
            Amigo amigo = (Amigo)sender;

            PrintLog(Maked.take, Action.keepalive, amigo.nickname, "KeepAlive recebido");
        }
예제 #4
0
        public void OnTakeSearch(object sender, EventArgs e)
        {
            Amigo amigo = (Amigo)sender;

            PrintLog(Maked.take, Action.search, amigo.nickname, "Search recebido");
        }
예제 #5
0
        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
 public void Report(Amigo amigo, string msg)
 {
     MakeReport(amigo.address.ToString(), msg);
 }