void chat_app::check_mail(m::message m) try { INVARIANT(_conversation); INVARIANT(_conversation_service); if(m::is_remote(m)) m::expect_symmetric(m); else m::expect_plaintext(m); if(m.meta.type == MESSAGE) { text_message t; t.from_message(m); auto c = _conversation->contacts().by_id(t.from_id); if(!c) return; //older clients do not have clocks if(t.has_clock) { //discard resent messages if(t.clock <= _clock) return; //merge clocks _clock += t.clock; } add_text(make_message_str("black", c->name(), t.text)); _conversation_service->fire_conversation_alert(_conversation->id(), visible()); alerted(); } else if(m.meta.type == JOINED) { joined_message t; t.from_message(m); contact_joined(t.from_id); } else { LOG << "chat sample received unknown message `" << m.meta.type << "'" << std::endl; } } catch(std::exception& e) { LOG << "chat_app: error in check_mail. " << e.what() << std::endl; } catch(...) { LOG << "chat_app: unexpected error in check_mail." << std::endl; }
void script_app::init() { INVARIANT(root()); INVARIANT(layout()); INVARIANT(_conversation); INVARIANT(_app); //setup frontend setup_decorations(); _canvas = new QWidget; _canvas_layout = new QGridLayout{_canvas}; layout()->addWidget(_canvas, 1,0,2,3); auto front = std::make_shared<qtw::qt_frontend>(_canvas, _canvas_layout, nullptr); connect(front.get(), SIGNAL(alerted()), this, SLOT(got_alert())); _front = std::make_shared<qtw::qt_frontend_client>(front); set_main(_canvas); //setup mail _mail = std::make_shared<m::mailbox>(_id); _sender = std::make_shared<ms::sender>(_conversation->user_service(), _mail); //setup api and backend _api = std::make_shared<l::lua_api>( _app, _sender, _conversation, _conversation_service, _front.get()); _api->who_started_id = _from_id; _back = std::make_shared<l::backend_client>(_api.get(), _mail); //assign backend to frontend _front->set_backend(_back.get()); //run script and start backend on seperate thread _back->run(_app->code()); _back->start(); //setup mail service INVARIANT(_api); INVARIANT(_front); INVARIANT(_back); INVARIANT(_conversation); INVARIANT(_mail); INVARIANT(_sender); }
void script_app::start() { INVARIANT(root()); INVARIANT(layout()); INVARIANT(_conversation); INVARIANT(_app); //setup frontend auto front = std::make_shared<qtw::qt_frontend>(_canvas, _canvas_layout, nullptr); connect(front.get(), SIGNAL(alerted()), this, SLOT(got_alert())); connect(front.get(), SIGNAL(do_adjust_size()), this, SLOT(got_adjust_size())); connect(front.get(), SIGNAL(mic_added()), this, SLOT(got_mic_added())); _front = std::make_shared<qtw::qt_frontend_client>(front); connect(_front.get(), SIGNAL(got_report_error(const std::string&)), this, SLOT(got_error(const std::string&))); //setup api and backend _api = std::make_shared<l::lua_api>( _app, _sender, _conversation, _conversation_service, _front.get()); _api->who_started_id = _from_id; _back = std::make_shared<l::backend_client>(_api, _mail); //assign backend to frontend _front->set_backend(_back.get()); //run script and start backend on seperate thread _back->run(_app->code()); _back->start(); //setup mail service INVARIANT(_api); INVARIANT(_front); INVARIANT(_back); INVARIANT(_conversation); }
void SessionChildItem::receiveMessage(IrcMessage* message) { if (m_usermodel) m_usermodel->processMessage(message); if (message->type() == IrcMessage::Numeric) { IrcNumericMessage* numeric = static_cast<IrcNumericMessage*>(message); switch (numeric->code()) { case Irc::RPL_NAMREPLY: if (m_sent.contains(IrcCommand::Names)) return; break; case Irc::RPL_ENDOFNAMES: if (m_sent.contains(IrcCommand::Names)) { emit namesReceived(m_usermodel->users()); m_sent.remove(IrcCommand::Names); return; } break; case Irc::RPL_TOPIC: if (isChannel()) { setSubtitle(message->parameters().value(2)); setDescription(IrcUtil::messageToHtml(subtitle())); } break; case Irc::RPL_WHOISUSER: if (!isChannel()) { setSubtitle(message->parameters().value(5)); setDescription(IrcUtil::messageToHtml(subtitle())); } if (m_sent.contains(IrcCommand::Whois)) { m_whois.append(tr("Ident: %1").arg(message->parameters().value(2))); m_whois.append(tr("Host: %1").arg(message->parameters().value(3))); m_whois.append(tr("Name: %1").arg(message->parameters().value(5))); return; } break; case Irc::RPL_WHOISSERVER: if (m_sent.contains(IrcCommand::Whois)) { m_whois.append(tr("Server: %1 (%2)").arg(message->parameters().value(2), message->parameters().value(3))); return; } break; case Irc::RPL_WHOISOPERATOR: if (m_sent.contains(IrcCommand::Whois)) { m_whois.append(tr("IRC operator")); return; } break; case Irc::RPL_WHOISACCOUNT: if (m_sent.contains(IrcCommand::Whois)) { m_whois.append(tr("Logged in as: %1").arg(message->parameters().value(2))); return; } break; case Irc::RPL_WHOISREGNICK: if (m_sent.contains(IrcCommand::Whois)) { m_whois.append(tr("Registered nick")); return; } break; case Irc::RPL_WHOISSECURE: if (m_sent.contains(IrcCommand::Whois)) { m_whois.append(tr("Secure connection")); return; } break; case Irc::RPL_WHOISIDLE: if (m_sent.contains(IrcCommand::Whois)) { QDateTime signon = QDateTime::fromTime_t(message->parameters().value(3).toInt()); QTime idle = QTime().addSecs(message->parameters().value(2).toInt()); m_whois.append(tr("Connected: %1").arg(signon.toString())); m_whois.append(tr("Idle: %1").arg(idle.toString())); return; } break; case Irc::RPL_WHOISCHANNELS: if (m_sent.contains(IrcCommand::Whois)) { m_whois.append(tr("Channels: %1").arg(message->parameters().value(2))); return; } break; case Irc::RPL_WHOISHOST: case Irc::RPL_WHOISMODES: if (m_sent.contains(IrcCommand::Whois)) { return; } break; case Irc::RPL_ENDOFWHOIS: if (m_sent.contains(IrcCommand::Whois)) { emit whoisReceived(m_whois); m_sent.remove(IrcCommand::Whois); m_whois.clear(); } case Irc::RPL_WHOISHELPOP: case Irc::RPL_WHOISSPECIAL: return; default: break; } } if (message->type() == IrcMessage::Private) { IrcPrivateMessage* privMsg = static_cast<IrcPrivateMessage*>(message); QString alertText; if (isChannel()) { if (privMsg->message().contains(m_parent->session()->nickName(), Qt::CaseInsensitive)) { setHighlighted(true); if (!isCurrent()) alertText = tr("%1 on %2:\n%3").arg(privMsg->sender().name()).arg(title()).arg(privMsg->message()); } } else { setHighlighted(true); if (!isCurrent()) alertText = tr("%1 in private:\n%2").arg(privMsg->sender().name()).arg(privMsg->message()); } if (!alertText.isEmpty()) emit alerted(alertText); if (!isCurrent()) setUnreadCount(unreadCount() + 1); } const QString formatted = messageFormatter()->formatMessage(message, m_usermodel); if (!formatted.isEmpty()) appendMessage(formatted); }
void script_app::got_alert() { alerted(); }