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(); }
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(); }
private void OnTakeKeepAlive(object sender, EventArgs e) { Amigo amigo = (Amigo)sender; PrintLog(Maked.take, Action.keepalive, amigo.nickname, "KeepAlive recebido"); }
public void OnTakeSearch(object sender, EventArgs e) { Amigo amigo = (Amigo)sender; PrintLog(Maked.take, Action.search, amigo.nickname, "Search recebido"); }
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(); }
public void Report(Amigo amigo, string msg) { MakeReport(amigo.address.ToString(), msg); }