/// <summary> /// abrir chat novo pela listview /// </summary> private void AbrirJanela() { bool debug = false; // "true" permite abrir janela do proprio usuario para testes. DadosConversa user = lstUsuarios.SelectedItems[0].Tag as DadosConversa; if (user.ReceiverIP.Equals(Config.Default.UserIP) && !debug) { MessageBox.Show("Não fale sozinho."); } else { FrmPrivado chat = IsOpenChat(user.ReceiverIP); chat = chat == null?OpenChat() : chat; if (chat.DadosJanela == null) { DadosConversa dados = new DadosConversa(); dados.ReceiverIP = user.ReceiverIP; dados.ReceiverUSER = user.ReceiverUSER; dados.SenderIP = Config.Default.UserIP; dados.SenderUSER = Config.Default.Username; chat.DadosJanela = dados; } SetTop(chat); } }
public void GravaDadosUser(string Novonome, string userIP, string userTCP, string Novostatus) { string ReceiverIP = string.Empty; foreach (ListViewItem listitem in lstUsuarios.Items) { DadosConversa dadosatuais = listitem.Tag as DadosConversa; if (dadosatuais != null && userIP.Equals(dadosatuais.ReceiverIP)) { if (!Novonome.Equals(dadosatuais.ReceiverUSER) || !Novostatus.Equals(dadosatuais.ReceiverStatus)) { listitem.Text = Novonome; listitem.Tag = new DadosConversa() { ReceiverIP = userIP, ReceiverTCP = userTCP, ReceiverUSER = Novonome, ReceiverStatus = Novostatus }; SetaStatus(listitem, Novostatus); } } } FrmPrivado chat = lstAtivos.FirstOrDefault(jujuba => jujuba.DadosJanela.ReceiverIP.Equals(userIP)); if (chat != null) { chat.DadosJanela.ReceiverUSER = Novonome; chat.DadosJanela.ReceiverStatus = Novostatus; chat.Text = Novonome; SetaEvento(chat, "UserChanged"); } }
/// <summary> /// Remove usuários desconectados da Listview e dispara o evento user offline. /// </summary> /// <param name="userIP">IP do usuário remoto</param> public void RemoveUser(string userIP) { ListViewItem lstitem = null; string ReceiverIP = string.Empty; foreach (ListViewItem listboxitem in lstUsuarios.Items) { DadosConversa user = listboxitem.Tag as DadosConversa; if (user != null && userIP.Equals(user.ReceiverIP)) { lstitem = listboxitem; ReceiverIP = user.ReceiverIP; break; } } if (lstitem != null) { lstUsuarios.Items.Remove(lstitem); Mensagem eve = new Mensagem(); FrmPrivado chat = IsOpenChat(ReceiverIP); if (chat != null) { SetaEvento(chat, "user_offline"); } } }
/// <summary> /// Cria janela do chat e adiciona na lista /// </summary> /// <returns></returns> private FrmPrivado OpenChat() { FrmPrivado novochat = new FrmPrivado(Fechar); novochat.Resize += novochat_Activated; novochat.Activated += novochat_Activated; lstAtivos.Add(novochat); novochat.WindowState = FormWindowState.Minimized; return(novochat); }
/// <summary> /// Seta o foco da janela para o topo /// </summary> /// <param name="chat"></param> private void SetTop(FrmPrivado chat) { if (chat == null) { return; } chat.TopMost = true; chat.TopMost = false; chat.WindowState = FormWindowState.Normal; chat.Show(); }
private void SetaEvento(FrmPrivado chat, string evento) { Mensagem eve = new Mensagem(); eve.ReceiverIP = chat.DadosJanela.ReceiverIP; eve.SenderIP = chat.DadosJanela.SenderIP; eve.ReceiverUSER = chat.DadosJanela.ReceiverUSER; eve.SenderUSER = chat.DadosJanela.SenderUSER; eve.EVENTO = evento; chat.Eventos(eve); }
/// <summary> /// Verifica se o chat já foi criado e está na lista de ativos /// </summary> /// <param name="ReceiverIP"> Ip de origem</param> /// <returns></returns> private FrmPrivado IsOpenChat(string ReceiverIP) { foreach (FrmPrivado chat in lstAtivos) // testa se já existe chat aberto com o usuário remoto { FrmPrivado novochat = null; if (chat != null && chat.DadosJanela.ReceiverIP.Equals(ReceiverIP)) { return(chat); } } return(null); }
/// <summary> /// Exibe mensagem recebida do cliente /// </summary> /// <param name="ReceiverIP">Ip do cliente</param> private FrmPrivado SetMessage(string ReceiverIP) { FrmPrivado novochat = null; novochat = IsOpenChat(ReceiverIP); //se chat não tiver aberto criar novo if (novochat == null) { novochat = OpenChat(); } FrmPrivado focused = HasFocus(lstAtivos); if (novochat == focused) { return(novochat); } if (Config.Default.AbrirJanela) { //Se abrir verificar foco dos chats if (focused != null) { focused.TopMost = true; novochat.WindowState = FormWindowState.Normal; novochat.Show(); Thread.Sleep(450); focused.TopMost = false; Flash(false, novochat.Handle); } else { SetTop(novochat); } } else { novochat.Show(); Flash(false, novochat.Handle); } return(novochat); }
/// <summary> /// Adiciona dados dos usuários recebidos por broadcast na Listview principal. /// </summary> /// <param name="username">Nome do usuário remoto</param> /// <param name="userIP">IP do usuário remoto</param> /// <param name="portaTCP">Porta TCP usada pelo usuário</param> /// <param name="status">status do usuário</param> public void AddUser(string username, string userIP, string portaTCP, string status) { bool verifica = false; string ReceiverIP = string.Empty; foreach (ListViewItem listboxitem in lstUsuarios.Items) { DadosConversa user = listboxitem.Tag as DadosConversa; if (user != null && userIP.Equals(user.ReceiverIP)) { verifica = true; ReceiverIP = user.ReceiverIP; break; } } if (!verifica) { ListViewItem lstitem = new ListViewItem(); lstitem.Text = username; lstitem.Tag = new DadosConversa() { ReceiverIP = userIP, ReceiverTCP = portaTCP, ReceiverUSER = username, ReceiverStatus = status }; lstUsuarios.Items.Add(lstitem); SetaStatus(lstitem, status); if (userIP != Config.Default.UserIP) { Online(); } } else { FrmPrivado chat = lstAtivos.FirstOrDefault(jujuba => jujuba.DadosJanela.ReceiverIP.Equals(userIP)); if (chat != null) { SetaEvento(chat, "user_online"); } } }
/// <summary> /// Verifica se o Chat possui foco /// </summary> /// <param name="chat"></param> /// <returns></returns> private FrmPrivado HasFocus(FrmPrivado chat) { return((chat.Focused || chat.Controls.Cast <Control>().Any(x => x.Focused)) ? chat : null); }
public FrmChat(string args) { InitializeComponent(); lstUsuarios.MultiSelect = false; lstUsuarios.FullRowSelect = true; lstUsuarios.SmallImageList = statusIcons; bandeja.Visible = true; Version version = Assembly.GetExecutingAssembly().GetName().Version; lblStatus.Text = "v. " + version.Major + "." + version.Minor; StartParams(args); Closing += FrmChat_Closing; this.FormClosing += FrmChat_FormClosing; HandleCreated += FrmChat_HandleCreated; lstUsuarios.MouseClick += lstUsuarios_MouseClick; lstUsuarios.KeyDown += lstUsuarios_KeyDown; bandeja.DoubleClick += bandeja_DoubleClick; btnMenu.Click += btnMenu_Click; Resize += FrmChat_Resize; usuárioToolStripMenuItem.Click += usuárioToolStripMenuItem_Click; opçõesToolStripMenuItem.Click += opçõesToolStripMenuItem_Click; históricoToolStripMenuItem.Click += históricoToolStripMenuItem_Click; sairToolStripMenuItem1.Click += sairToolStripMenuItem_Click; if (!Config.Default.ParamSetados) { Config cfg = new Config(); cfg.DefineParam(); } SetHeight(lstUsuarios, 25); // método para definir espaçamento da listview //RecebeMensagem(); StartListening(); #region Delegate Lista de Usuários lstDelegate = delegate(object item) { string[] split = item.ToString().Split('|'); string username = split[0]; string userIP = split[1]; string userTCP = split[2]; string evento = split[3]; string status = split[4]; if (evento.Contains("add")) { AddUser(username, userIP, userTCP, "online"); } else if (evento.Contains("remove")) { RemoveUser(userIP); return(null); } GravaDadosUser(username, userIP, userTCP, status); return(null); }; #endregion #region Delegate Recebimento de Mensagem msgDelegate = delegate(object msg) { Mensagem dados = msg as Mensagem; FrmPrivado chat = null; if (string.IsNullOrEmpty(dados.EVENTO)) { chat = SetMessage(dados.SenderIP); if (chat.DadosJanela == null) { DadosConversa conversa = new DadosConversa(); conversa.ReceiverIP = dados.SenderIP; conversa.ReceiverUSER = dados.SenderUSER; conversa.SenderIP = Config.Default.UserIP; conversa.SenderUSER = Config.Default.Username; chat.DadosJanela = conversa; } chat.RecebeMsg(dados); return(null); } else if ((chat = IsOpenChat(dados.SenderIP)) != null) { chat.Eventos(dados); } else if (dados.EVENTO == "img_request") { SendUserPicture(dados); } return(null); }; #endregion }