Esempio n. 1
0
void QStreamCubeChat::onSmilesLoaded()
{
    QNetworkReply * reply = qobject_cast< QNetworkReply * >( sender() );

    QJsonParseError parseError;

    QJsonDocument jsonDoc = QJsonDocument::fromJson( reply->readAll(), &parseError );

    if( QJsonParseError::NoError == parseError.error && jsonDoc.isArray() )
    {
        QJsonArray jsonArr =jsonDoc.array();

        for( const QJsonValue & smileVal : jsonArr )
        {
            QJsonArray smileInfo = smileVal.toArray();

            addSmile( smileInfo[ 0 ].toString(), DEFAULT_STREAM_CUBE_SMILE_PREFIX + smileInfo[ 1 ].toString() );
        }

        if( isShowSystemMessages() )
        {
            emit newMessage( ChatMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Smiles loaded..." ), QString(), this ) );
            emitSystemMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Smiles loaded..." ) );
        }
    }
    else
    {
        emit newMessage( ChatMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Can not load smiles..." ), QString(), this ) );
        emitSystemMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Can not laod smiles..." ) );
    }

    reply->deleteLater();
}
Esempio n. 2
0
void QVidiChat::onSocketMessageReceived( const QString & message )
{   
    QJsonParseError parseError;

    QJsonDocument jsonDoc = QJsonDocument::fromJson( message.toUtf8(), &parseError );

    if( QJsonParseError::NoError == parseError.error && jsonDoc.isObject() )
    {
        QJsonObject jsonObj = jsonDoc.object();

        QString type = jsonObj[ "type" ].toString();

        if( "message" == type )
        {
            //{\"type\":\"message\",\"data\":{\"channel_id\":1024,\"user_id\":1016,\"user_name\":\"c0deum\",\"user_rights\":20,\"user_groups\":[],\"hideIcon\":0,\"icon\":\"\",\"color\":\"\",\"isStatus\":0,\"mobile\":0,\"paidsmiles\":{\"0\":[],\"1024\":[]},\"message_id\":3,\"timestamp\":1460203043,\"text\":\"123\"}}

            QJsonObject jsonMessageInfo = jsonObj[ "data" ].toObject();

            QString nickName = jsonMessageInfo[ "user_name" ].toString();
            QString messageText = jsonMessageInfo[ "text" ].toString();

            messageText = ChatMessage::deleteTags( messageText );

            emit newMessage( ChatMessage( SERVICE_NAME, nickName, messageText, QString(), this ) );
        }
        else if( "welcome" == type )
        {
            socket_->sendTextMessage( "{\"type\":\"auth\",\"data\":{\"token\":\"undefined\",\"site_id\":2}}" );
        }
        else if( "success_auth" == type )
        {
            socket_->sendTextMessage( "{\"type\":\"unjoin\",\"data\":{\"channel_id\":\"" + channelId_ +"\"}}" );
            socket_->sendTextMessage( "{\"type\":\"join\",\"data\":{\"channel_id\":\"" + channelId_ + "\",\"hidden\":false,\"mobile\":0}}" );
        }
        else if( "success_join" == type )
        {
            if( isShowSystemMessages() )
            {
                emit newMessage( ChatMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Connected to " ) + channelName_ + "...", QString(), this ) );
                emitSystemMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Connected to " ) + channelName_ + tr( "..." ) );
            }

            loadStatistic();
            startUniqueTimer( statisticTimerId_, STATISTIC_INTERVAL );

            startUniqueTimer( saveSocketConnectionTimerId_, SAVE_SOCKET_CONNECTION_INTERVAL );
        }
    }

    //{\"type\":\"get_channel_counters\",\"data\":{\"channel_id\":1024}}
    //{\"type\":\"get_channel_history\",\"data\":{\"channel_id\":1024,\"from\":0}}

    //

    //{\"type\":\"channel_counters\",\"data\":{\"channel_id\":\"1024\",\"clients_in_channel\":1,\"users_in_channel\":0}}
    //{\"type\":\"message\",\"data\":{\"channel_id\":1024,\"user_id\":1016,\"user_name\":\"c0deum\",\"user_rights\":20,\"user_groups\":[],\"hideIcon\":0,\"icon\":\"\",\"color\":\"\",\"isStatus\":0,\"mobile\":0,\"paidsmiles\":{\"0\":[],\"1024\":[]},\"message_id\":3,\"timestamp\":1460203043,\"text\":\"123\"}}
}
Esempio n. 3
0
void CChatControl::AddServer(CString Host, UINT Port)
{
	// If server already exists
	for(int i = 0; i < m_ServerList.size(); i++)
	{
		CChatServer* pServer = m_ServerList[i];

		if(pServer->m_Host == Host)
		{
			if(pServer->m_Status == SOCK_CLOSED)
			{
				if(pServer->m_hSocket == INVALID_SOCKET)
					pServer->Create();
						//m_pDoc->LogError("Chat Create Error: " + DWrdtoStr(pServer->GetLastError()));
				
				pServer->Connect(Host, Port);
			}

			ChatMessage(CHAT_UPDATE, NULL);
			ChatMessage(CHAT_SELECT, (DWORD) pServer->m_Console);
		
			return;
		}
	}

	if(!m_pPrefs->m_DisableIdent)
		StartIdentd();
	
	CChatServer* Server = new CChatServer(this, Host, Port);

	//Attempt to connect to node
	Server->Create();
		//m_pDoc->LogError("Chat Create Error: " + DWrdtoStr(Server->GetLastError()));

	if( !Server->Connect(Host, Port) )
		if (Server->GetLastError() != WSAEWOULDBLOCK)
		{
			delete Server;
			return;
		}

	// Add node to list
	
	m_ServerList.push_back(Server);


	ChatMessage(CHAT_UPDATE, NULL);
}
Esempio n. 4
0
void Manager::ManageIncMsg() {
  while (!inc_msg_.empty()) {
    network::Message *msg = inc_msg_.front();
    network::Message::MessageType type = msg->GetType();

    std::string name;
    switch (type) {
      case network::Message::kTypeLogin:
        int fd;
        msg->Extract(name);
        msg->Extract(fd);
        LoginClient(fd, name);
        break;
      case network::Message::kTypeLogout:
        boost::uuids::uuid uid;
        msg->Extract(uid);
        LogoutClient(uid);
        break;
      case network::Message::kTypeChat:
        network::Message::ChatMessage chat;
        std::string chat_msg;
        msg->Extract(chat);
        msg->Extract(name);
        msg->Extract(chat_msg);
        ChatMessage(chat, name, chat_msg);
        break;
    }

    inc_msg_.pop();
    delete msg;
  }
}
Esempio n. 5
0
void QStreamCubeChat::onChannelInfoLoaded()
{
    QNetworkReply * reply = qobject_cast< QNetworkReply * >( sender() );

    QJsonParseError parseError;

    QJsonDocument jsonDoc = QJsonDocument::fromJson( reply->readAll(), &parseError );

    if( QJsonParseError::NoError == parseError.error && jsonDoc.isArray() )
    {
        QJsonArray jsonArr = jsonDoc.array();

        channelId_ = jsonArr[ 0 ].toString();

        if( isShowSystemMessages() )
        {
            emit newMessage( ChatMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Connected to " ) + channelName_ + tr( "..." ), QString(), this ) );
            emitSystemMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Connected to " ) + channelName_ + tr( "..." ) );
        }

        loadMessages();
        startUniqueTimer( updateTimerId_, UPDATE_INTERVAL );
    }

    reply->deleteLater();
}
Esempio n. 6
0
// We received a new incoming chat message...  Add it to the list
void AbstractChat::newMessage(const string &from, const string &message, bool isPrivate, bool isSystem, bool fromSelf)
{
   // Don't display it if it is from a muted player
   if(mGame->isOnMuteList(from))
      return;

   // Choose a color
   Color color;

   if(fromSelf)
      color = Colors::white;                  
   else                                       
   {
      if(mFromColors.count(from) == 0)        // See if we have a color for this nick
         mFromColors[from] = getNextColor();  // If not, get one

      color = mFromColors[from];
   }

   mMessages[mMessageCount % MESSAGES_TO_RETAIN] = ChatMessage(from, message, color, isPrivate, isSystem);
   mMessageCount++;

   if(fromSelf && isPrivate)     // I don't think this can ever happen!  ==> Should be !fromSelf ?
      deliverPrivateMessage(from.c_str(), message.c_str());
}
Esempio n. 7
0
TEST(GoodEnoughTest, SimpleTrigger)
{
    GoodEnoughBot testbot;
    GoodEnough test(&testbot);

    test.HandleMessage(ChatMessage("TestUser", "", "", "This test shoud be good enough", false));
    EXPECT_TRUE(testbot._success);
}
Esempio n. 8
0
void CChatControl::RemoveServer(CChatServer* pServer)
{	
	if(pServer)
	{
		std::vector<CChatServer*>::iterator itServer;
		for(itServer = m_ServerList.begin(); itServer != m_ServerList.end(); itServer++)
			if(*itServer == pServer)
			{
				delete *itServer;
				m_ServerList.erase(itServer);
				
				itServer--;
			}

		// First clear channel, then select it
		ChatMessage(CHAT_UPDATE, NULL);
		ChatMessage(CHAT_UPDATE, NULL);
	}
}
Esempio n. 9
0
void QVidiChat::onSocketConnetError()
{
    if( isShowSystemMessages() )
    {
        emit newMessage( ChatMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "WebSocket Error... " ), QString(), this ) );
        emitSystemMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "WebSocket Error..." ));
    }

    startUniqueTimer( reconnectTimerId_, RECONNECT_INTERVAL );
}
Esempio n. 10
0
void QStreamCubeChat::onMessagesLoadError()
{
    QNetworkReply * reply = qobject_cast< QNetworkReply * >( sender() );

    if( isShowSystemMessages() )
    {
        emit newMessage( ChatMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Can not load messages..." ), QString(), this ) );
        emitSystemMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Can not laod messages..." ) );
    }

    reply->deleteLater();
}
Esempio n. 11
0
void QStreamCubeChat::reconnect()
{
    QString oldChannelName = channelName_;
    disconnect();
    loadSettings();
    if( isEnabled() && !channelName_.isEmpty() && !oldChannelName.isEmpty() && isShowSystemMessages() )
    {
        emit newMessage( ChatMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Reconnecting to " ) + channelName_ + tr( "..." ), QString(), this ) );
        emitSystemMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Reconnecting to " ) + channelName_ + tr( "..." ) );
    }
    connect();
}
Esempio n. 12
0
void QStreamCubeChat::onMessagesLoaded()
{
    QNetworkReply * reply = qobject_cast< QNetworkReply * >( sender() );

    QByteArray data = reply->readAll();

    QJsonParseError parseError;

    QJsonDocument jsonDoc = QJsonDocument::fromJson( data, &parseError );

    if( QJsonParseError::NoError == parseError.NoError && jsonDoc.isArray() )
    {
        QJsonArray jsonMessagesArr = jsonDoc.array();

        if( "0" == lastMessageId_ )
        {
            for( const QJsonValue & messageValue : jsonMessagesArr )
            {
                QJsonArray messageInfoArr = messageValue.toArray();

                if( messageInfoArr[ 1 ].toString().toInt() > lastMessageId_.toInt() )
                    lastMessageId_ = messageInfoArr[ 1 ].toString();
            }
        }
        else
        {
            for( const QJsonValue & messageValue : jsonMessagesArr )
            {
                QJsonArray messageInfoArr = messageValue.toArray();

                if( messageInfoArr[ 1 ].toString().toInt() > lastMessageId_.toInt() )
                {
                    QString nickName = messageInfoArr[ 3 ].toString();
                    QString message = messageInfoArr[ 5 ].toString();

                    if( "1" == messageInfoArr[ 0 ].toString() )
                    {
                        message = messageInfoArr[ 7 ].toString() + ", " + message;
                    }

                    message = insertSmiles( message );

                    lastMessageId_ = messageInfoArr[ 1 ].toString();

                    emit newMessage( ChatMessage( SERVICE_NAME, nickName, message, QString(), this ) );
                }
            }
        }
    }

    reply->deleteLater();
}
Esempio n. 13
0
void QVidiChat::connect()
{
    if( !isEnabled() || channelName_.isEmpty() )
        return;

    if( isShowSystemMessages() )
    {
        emit newMessage( ChatMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Connecting to " ) + channelName_ + tr( "..." ), QString(), this ) );
        emitSystemMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Connecting to " ) + channelName_ + tr( "..." ) );
    }

    loadChannelInfo();
}
Esempio n. 14
0
void QStreamCubeChat::onChannelInfoLoadError()
{
    QNetworkReply * reply = qobject_cast< QNetworkReply * >( sender() );

    if( isShowSystemMessages() )
    {
        emit newMessage( ChatMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Can not connect to " ) + channelName_ + tr( "..." ), QString(), this ) );
        emitSystemMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Can not connect to " ) + channelName_ + tr( "..." ) );
    }

    startUniqueTimer( reconnectTimerId_, RECONNECT_INTERVAL );
    reply->deleteLater();
}
Esempio n. 15
0
void QYoutubeChatEx::message(const QString message, const QString authorName, const QString authorImageLogo, bool isChatModerator, bool isChatOwner, bool isChatSponsor)
{
    bool blackListUser = blackList().contains( authorName );
    bool supportersListUser = supportersList().contains( authorName );

    QString userType = "";

    if (blackListUser)
        userType = "ignore";
    else
    if (supportersListUser||isChatSponsor)
        userType = "supporter";

    emit newMessage( ChatMessage( YOUTUBE_SERVICE, authorName, message , userType, this ) );
}
Esempio n. 16
0
void Connection::readChat(QDataStream& s)
{
    int a,b;
    s>>a;
    qDebug()<<"Hei "<<a;
    char* buf = new char[2*a+1];
    s.readRawData(buf,2*a);
    buf[2*a]=0;
    QString chatName=QString::fromRawData((QChar*)buf,a);
    s>>b;
    buf = new char[2*b+1];
    s.readRawData(buf,2*b);
    buf[2*b]=0;
    QString chatMsg=QString::fromRawData((QChar*)buf,b);
    engine.chatList.append(ChatMessage(QDateTime::currentDateTime(),chatName,chatMsg));

}
Esempio n. 17
0
void Bot::StartGame (void)
{
   // this function handles the selection of teams & class

   // handle counter-strike stuff here...
   if (m_startAction == CMENU_TEAM)
   {
      m_startAction = CMENU_IDLE;  // switch back to idle

      if (yb_forceteam.GetString ()[0] == 'C' || yb_forceteam.GetString ()[0] == 'c')
         m_wantedTeam = 2;
      else if (yb_forceteam.GetString ()[0] == 'T' || yb_forceteam.GetString ()[0] == 't')
         m_wantedTeam = 1;

      if (m_wantedTeam != 1 && m_wantedTeam != 2)
         m_wantedTeam = 5;

      // select the team the bot wishes to join...
      FakeClientCommand (GetEntity (), "menuselect %d", m_wantedTeam);
   }
   else if (m_startAction == CMENU_CLASS)
   {
      m_startAction = CMENU_IDLE;  // switch back to idle

      if (g_gameVersion == CSVER_CZERO) // czero has spetsnaz and militia skins
      {
         if (m_wantedClass < 1 || m_wantedClass > 5)
            m_wantedClass = engine->RandomInt (1, 5); //  use random if invalid
      }
      else
      {
         if (m_wantedClass < 1 || m_wantedClass > 4)
            m_wantedClass = engine->RandomInt (1, 4); // use random if invalid
      }

      // select the class the bot wishes to use...
      FakeClientCommand (GetEntity (), "menuselect %d", m_wantedClass);

      // bot has now joined the game (doesn't need to be started)
      m_notStarted = false;

      // check for greeting other players, since we connected
      if (engine->RandomInt (0, 100) < 20)
         ChatMessage (CHAT_HELLO);
   }
}
Esempio n. 18
0
	void ProcessChatStanza(const buzz::XmlElement* Stanza)
	{
		check(Stanza != NULL);

		const buzz::XmlElement* XmlBody = Stanza->FirstNamed(buzz::QN_BODY);
		
		static const buzz::StaticQName QN_DELAY = { "urn:xmpp:delay", "delay" };
		const buzz::XmlElement* Delay = Stanza->FirstNamed(QN_DELAY);

		FXmppChatMessageJingle ChatMessage(
			buzz::Jid(Stanza->Attr(buzz::QN_FROM)),
			buzz::Jid(Stanza->Attr(buzz::QN_TO)),
			XmlBody != NULL ? XmlBody->BodyText() : std::string(),
			Delay != NULL ? Delay->Attr(buzz::kQnStamp) : std::string()
			);
		
		SignalChatReceived(ChatMessage);
	}
Esempio n. 19
0
void QVidiChat::onChannelInfoLoaded()
{
    QNetworkReply * reply = qobject_cast< QNetworkReply * >( sender() );

    QJsonParseError parseError;

    QJsonDocument jsonDoc = QJsonDocument::fromJson( reply->readAll(), &parseError );

    if( QJsonParseError::NoError == parseError.error && jsonDoc.isObject() )
    {
        QJsonObject jsonObj = jsonDoc.object();

        QJsonObject jsonUser = jsonObj[ "user" ].toObject();

        QJsonObject jsonChannel = jsonUser[ "Channel" ].toObject();

        channelId_ = jsonChannel[ "name" ].toString();


        int delPos = channelId_.indexOf( '_' );

        if( delPos > 0 )
        {
            channelId_ = channelId_.right( channelId_.length() - delPos - 1 );
            connectToSocket();
        }
        else
        {
            if( isShowSystemMessages() )
            {
                emit newMessage( ChatMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Can not connect to " ) + channelName_ + "...", QString(), this ) );
                emitSystemMessage( SERVICE_NAME, SERVICE_USER_NAME, tr( "Can not connect to " ) + channelName_ + tr( "..." ) );
            }

            startUniqueTimer( reconnectTimerId_, RECONNECT_INTERVAL );
        }


        //        connectToJoinSocket();
        //loadSid();
    }

    reply->deleteLater();
}
Esempio n. 20
0
static int __cdecl CHAT_EVENT(WPARAM /* wParam */, LPARAM lParam)
{
	GCHOOK* pgch = (GCHOOK*)lParam;
	switch ( pgch->pDest->iType )
	{
	case GC_USER_MESSAGE:
		{
			// ƒублирование в чат
			ChatMessage( pgch->pDest->ptszID, pgch->ptszText );

			// ќтправка сообщени¤
			DWORD dwLastError = 0;
			SendMessage( pgch->pDest->ptszID, pgch->ptszText, dwLastError );
		}
		break;
	}

	return 0;
}
Esempio n. 21
0
void UserConnection::handlePM(const AdcCommand& c, bool echo) noexcept {
	auto message = c.getParam(0);

	auto cm = ClientManager::getInstance();
	auto lock = cm->lock();
	auto peer = cm->findOnlineUser(user->getCID(), hubUrl);
	auto me = cm->findOnlineUser(cm->getMe()->getCID(), hubUrl);
	// null pointers allowed here as the conn may be going on without hubs.

	if(echo) {
		std::swap(peer, me);
	}

	if(peer && peer->getIdentity().noChat())
		return;

	if(PluginManager::getInstance()->runHook(HOOK_CHAT_PM_IN, peer, message))
		return;

	string tmp;
	fire(UserConnectionListener::PrivateMessage(), this, ChatMessage(message, peer, me, peer,
		c.hasFlag("ME", 1), c.getParam("TS", 1, tmp) ? Util::toInt64(tmp) : 0));
}
Esempio n. 22
0
void GameChat::add_message(const std::string& msg, const Colour& colour) {
	add_message(ChatMessage("", msg, Colour(), colour));
}
Esempio n. 23
0
void Game::handleRenderMessage(const Json::Value &v) {
  auto entities = must_have_idx(v, "entities");
  invariant(entities.isObject(), "should have entities array");
  auto entity_keys = entities.getMemberNames();
  for (auto &eid : entity_keys) {
    // find or create GameEntity corresponding to the
    auto it = game_to_render_id.find(eid);
    GameEntity *entity = nullptr;
    if (it == game_to_render_id.end()) {
      id_t new_id = Renderer::get()->newEntityID();
      auto game_entity = new GameEntity(new_id);
      game_entity->setGameID(eid);
      Renderer::get()->spawnEntity(game_entity);
      game_to_render_id[eid] = new_id;
      entity = game_entity;
    } else {
      entity = GameEntity::cast(Renderer::get()->getEntity(it->second));
    }
    renderEntityFromJSON(entity, entities[eid]);
  }

  auto events = must_have_idx(v, "events");
  invariant(events.isArray(), "events must be array");
  for (auto&& event : events) {
    add_effect(
        must_have_idx(event, "name").asString(),
        must_have_idx(event, "params"));
  }

  auto players = must_have_idx(v, "players");
  invariant(players.isArray(), "players must be array");
  for (int i = 0; i < players.size(); i++) {
    auto player = players[i];
    id_t pid = toID(must_have_idx(player, "pid"));
    requisition_[pid] = must_have_idx(player, "req").asFloat();
    power_[pid] = must_have_idx(player, "power").asFloat();
  }

  auto teams = must_have_idx(v, "teams");
  for (int i = 0; i < teams.size(); i++) {
    auto team = teams[i];
    id_t tid = toID(must_have_idx(team, "tid"));
    victoryPoints_[tid] = must_have_idx(team, "vps").asFloat();
  }

  auto chats = must_have_idx(v, "chats");
  for (int i = 0; i < chats.size(); i++) {
    auto json_chat = chats[i];
    auto chat = ChatMessage(
        toID(must_have_idx(json_chat, "pid")),
        must_have_idx(json_chat, "msg").asString(),
        Clock::now());
    chatListener_(chat);
  }
  const float t = must_have_idx(v, "t").asFloat();
  const float dt = must_have_idx(v, "dt").asFloat();
  const float render_t = Renderer::get()->getGameTime();
  if (render_t + dt > t) {
    LOG(WARNING) << "Renderer is ahead of game: " << render_t << " vs " << t << '\n';
    Renderer::get()->setGameTime(t - dt);
  }
  if (render_t < t - 2 * dt) {
    LOG(WARNING) << "Renderer is behind server " << render_t << " vs " << t << '\n';
    Renderer::get()->setGameTime(t - dt);
  }
}
Esempio n. 24
0
void DisplayTeamMsg(Player *player, string line)
{
	if (!player) return;

	game.world->hud->messageDisplayer->addMessage(ChatMessage(*player, line));
}
Esempio n. 25
0
void ReceiveContactMessage(LPCTSTR msg_from, LPCTSTR msg_to, LPCTSTR msg_text, int msg_len)
{
	if ( ! pluginInstalled )
		return;

	CString from( msg_from );
	CString to( msg_to );
	CString text( msg_text, msg_len );

	from.MakeUpper();
	to.MakeUpper();

	// Свое собственное сообщение?
	if ( IsItMe( from ) )
	{
		LOG ( "Ignoring my message." );
		return;
	}

	// Нормализация разбиения сообщения на строки
	Normalize( text );

	// Дубликат?
	if (db_get_b (NULL, modname, "Filter-dups", TRUE))
	{		
		// Вычисление прошедшего времени с последнего сообщения
		static FILETIME last_time = { 0, 0 };
		FILETIME current_time;
		GetSystemTimeAsFileTime (&current_time);
		ULONGLONG elapsed =
			((ULONGLONG) current_time.dwLowDateTime |
				(ULONGLONG) current_time.dwHighDateTime << 32) -
			((ULONGLONG) last_time.dwLowDateTime |
				(ULONGLONG) last_time.dwHighDateTime << 32);

		// Вычисление MD5-хэшей отправителя
		MD5Context ctx;
		md5init (&ctx);
		md5update (&ctx, (const unsigned char*)(LPCTSTR)from,
			from.GetLength() * sizeof (TCHAR));
		unsigned char digest_from_current [16] = {0};
		static unsigned char digest_from_last [16] = {0};
		md5final (digest_from_current, &ctx);

		// Вычисление MD5-хэшей сообщения
		md5init (&ctx);
		md5update (&ctx, (const unsigned char*)(LPCTSTR)text,
			text.GetLength() * sizeof (TCHAR));
		unsigned char digest_text_current [16] = {0};
		static unsigned char digest_text_last [16] = {0};
		md5final (digest_text_current, &ctx);

		// Если прошло менее 2 секунд между сообщениями
		if (elapsed < 20000000)
		{
			// И отправители совпадают
			if (memcmp (digest_from_current, digest_from_last, 16) == 0)
			{
				// И сообщение совпадает
				if (memcmp (digest_text_current, digest_text_last, 16) == 0)
				{
					// то пропускаем такое сообщение
					LOG ("Duplicate message detected");
					return;
				}
			}
		}
		last_time = current_time;
		CopyMemory (digest_from_last, digest_from_current, 16);
		CopyMemory (digest_text_last, digest_text_current, 16);
	}

#ifdef CHAT_ENABLED
	if ( ! IsItMe( to ) && pluginChatEnabled ) // Групповой адрес?
	{
		// Формирование группового сообщения
		if ( ChatNewSession( to ) )
		{
			// Добавить группу
			ATLVERIFY( ChatAddGroup( to, _T("Normal") ) );

			// Добавить себя
			ATLVERIFY( ChatJoinMe( to, _T("Normal") ) );

			// Добавить "От Кого"
			ATLVERIFY( ChatJoinUser( to, from, _T("Normal") ) );

			// Завершение создания чата
			ATLVERIFY( ChatInitDone( to ) );

			// Перевод чат-контакта в онлайн
			ATLVERIFY( ChatOnline( to ) );

			// Сообщение
			ATLVERIFY( ChatMessage( to, from, text ) );
		}
	}
	else
#endif // CHAT_ENABLED
	{
		// Формирование приватного сообщения
		HANDLE hContact = AddToListByName( from, 0, NULL, false, false );
		if ( hContact )
		{
			PROTORECVEVENT pre = { 0 };
			pre.timestamp = time ();
			CT2A textA( text );
			pre.szMessage = (LPSTR)(LPCSTR)textA;
			CCSDATA ccs = { 0 };
			ccs.szProtoService = PSR_MESSAGE;
			ccs.hContact = hContact;
			db_unset (ccs.hContact, "CList", "Hidden");
			ccs.lParam = (LPARAM) &pre;
			CallServiceSync (MS_PROTO_CHAINRECV, 0, (LPARAM) &ccs);

			// Переводим контакт в онлайн
			SetContactStatus( hContact, contact_scanner::ScanContact( hContact ), true );

			// Авто-ответчик
			if ( db_get_b( NULL, modname, "Auto-answer", FALSE ) )
				Autoanswer( hContact );
		}
	}
}
Esempio n. 26
0
//#yotube signals region
void QYoutubeChatEx::error(const QString errorMessage)
{
    if( isShowSystemMessages() )
        emit newMessage( ChatMessage( YOUTUBE_SERVICE, YOUTUBE_USER, "Error: " + errorMessage , "", this ) );
}