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(); }
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; } }
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 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(); }
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(); }
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 { } }
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)); }
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(); }
public void OnTakeReport(object sender, EventArgs e) { Pacote pacote = (Pacote)sender; PrintLog(Maked.take, Action.report, pacote.nickname, "Erro Recebido, message => " + pacote.message); }
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(); }
public virtual void OnTakeWhisper(Pacote pacote) { if (WhisperTake != null) WhisperTake(pacote, new EventArgs()); }
public virtual void OnTakeSay(Pacote pacote) { if (SayTake != null) SayTake(pacote, new EventArgs()); }
public virtual void OnTakeReport(Pacote pacote) { if (ReportTake != null) ReportTake(pacote, new EventArgs()); }
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 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; }
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(); }
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(); }
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(); }
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(); }
public void OnMakeReport(object sender, EventArgs e) { Pacote pacote = (Pacote)sender; PrintLog(Maked.make, Action.report, "Eu mesmo", "Erro Enviado, message => " + pacote.message); }
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(); }