Ejemplo n.º 1
0
            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;
            }
Ejemplo n.º 2
0
            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);
            }
Ejemplo n.º 3
0
            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);
            }
Ejemplo n.º 4
0
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);
}
Ejemplo n.º 5
0
 void script_app::got_alert()
 {
     alerted();
 }