예제 #1
0
void WebSocketManager::retrieveCallerInfoFinished()
{
    QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
    QByteArray data = reply->readAll();
    QString callerNumber = reply->property("caller_number").toString();
    reply->deleteLater();

    QJsonParseError error;
    QJsonDocument document = QJsonDocument::fromJson(data, &error);
    if (error.error != QJsonParseError::NoError)
        return;

    QString contactPerson = document.object().value("contact_person").toString();
    QString loginName = document.object().value("login_name").toString();
    QString callingNumber = document.object().value("calling_number").toString();
    QString companyName = document.object().value("company_name").toString();
    double balance = document.object().value("cur_balance").toDouble();

    ContactInfo *ci = new ContactInfo();
    ci->setContactPerson(contactPerson);
    ci->setLogin(loginName);
    ci->setCallingNumber(callingNumber);
    ci->setCompanyName(companyName);
    ci->setBalance(balance);

    m_contactsHash.insert(callerNumber, ci);

    emit channelCreated(ci);
}
예제 #2
0
void QDiscordStateComponent::channelCreateReceived(const QJsonObject& object)
{
	QSharedPointer<QDiscordChannel> channel =
		QSharedPointer<QDiscordChannel>(
			new QDiscordChannel(object, guild(object["guild_id"].toString("")))
		);
	if(channel->isPrivate())
	{
		_privateChannels.insert(channel->id(), channel);
		emit privateChannelCreated(channel);
	}
	else
	{
		if(!channel->guild())
			return;
		channel->guild()->addChannel(channel);
		emit channelCreated(channel);
	}
}
예제 #3
0
void WebSocketManager::processWsData(const QString &data)
{
    QJsonParseError error;
    QJsonDocument jsonDocument = QJsonDocument::fromJson(data.toLatin1(), &error);

    if (error.error != QJsonParseError::NoError)
        return;

    QString eventName = jsonDocument.object().value("name").toString();
    if (eventName == "CHANNEL_CREATE")
    {
        QJsonObject args = jsonDocument.object().value("args").toObject();
        QString callDirection = args.value("Call-Direction").toString();

        if (callDirection != "inbound") return; 

        QString callerNumber = args.value("Caller-ID-Number").toString();
        QString callId = args.value("Call-ID").toString();

        m_contactCallIdHash.insert(callerNumber, callId);

        m_createChannelHash.insert(callId, callerNumber);
        //QString calleeNumber = args.value("Callee-ID-Number").toString();

        if (m_contactsHash.contains(callerNumber))
        {
            ContactInfo *contactInfo = m_contactsHash.value(callerNumber);
            if (!contactInfo->isEmpty())
                emit channelCreated(contactInfo);
            return;
        }

        QByteArray hashTemplate(callerNumber.toLatin1());
        hashTemplate.append(":");
        hashTemplate.append(m_settings->value("md5_hash", kMd5Hash).toString());

        QByteArray hash = QCryptographicHash::hash(hashTemplate, QCryptographicHash::Md5).toHex();

        QNetworkRequest req;
        QString url(m_settings->value("info_url", kInfoUrl).toString());
        url.append(kCallerInfoQuery);
        req.setUrl(QUrl(url.arg(callerNumber).arg(hash.data())));
        QNetworkReply *reply = m_nam->get(req);
        reply->setProperty("caller_number", callerNumber);

        m_contactsHash.insert(callerNumber, new ContactInfo());

        connect(reply, &QNetworkReply::finished,
                this, &WebSocketManager::retrieveCallerInfoFinished);
    }
    else if (eventName == "CHANNEL_ANSWER")
    {
        QJsonObject args = jsonDocument.object().value("args").toObject();
        QString callDirection = args.value("Call-Direction").toString();

        if (callDirection != "inbound") return;

        QString callId = args.value("Call-ID").toString();
        QString calleeNumber = args.value("Callee-ID-Number").toString();
        if (!calleeNumber.isEmpty())
        {
            bool ok;
            qlonglong number = calleeNumber.toLongLong(&ok);
            Q_UNUSED(number);
            if (!ok)
                return;
        }

        QString callerNumber = m_contactCallIdHash.key(callId);

        if (m_contactsHash.contains(callerNumber))
        {
            ContactInfo *contactInfo = m_contactsHash.value(callerNumber);
            if (!contactInfo->isEmpty())
            {
                emit channelAnswered(contactInfo);
                m_contactCallIdHash.remove(callerNumber);
            }
        }
    }
    else if (eventName == "CHANNEL_DESTROY")
    {
        QJsonObject args = jsonDocument.object().value("args").toObject();
        //QString callerNumber = args.value("Caller-ID-Number").toString();
        QString callId = args.value("Call-ID").toString();

        if (m_createChannelHash.contains(callId))
        {
            QString number = m_createChannelHash.value(callId);
            m_createChannelHash.remove(callId);

            if (!m_createChannelHash.values().contains(number))
            {
                ContactInfo *contactInfo = m_contactsHash.value(number);
                m_contactsHash.remove(number);
                emit channelDestroyed(contactInfo);
            }
        }
    }
}