diff --git a/ryzom/server/src/entities_game_service/admin.cpp b/ryzom/server/src/entities_game_service/admin.cpp index 69a3941be..546fd3310 100644 --- a/ryzom/server/src/entities_game_service/admin.cpp +++ b/ryzom/server/src/entities_game_service/admin.cpp @@ -4577,17 +4577,20 @@ NLMISC_COMMAND (connectLangChannel, "Connect to lang channel", " CPVPManager2 *inst = CPVPManager2::getInstance(); - string action; string lang = args[1]; - if (lang != "en" && lang != "fr" && lang != "de" && lang != "ru" && lang != "es" && lang != "rf" - && lang != "rf-en" && lang != "rf-fr" && lang != "rf-de" && lang != "rf-ru" && lang != "rf-es") + if (lang != "en" && lang != "fr" && lang != "de" && lang != "ru" && lang != "es" && lang != "rf" && !c->havePriv(":DEV:")) return false; - bool leave = !c->havePriv(":DEV:"); // Since June 2020, no any lang channels, players only can leave it - + bool leave = false; if (args.size() > 2) leave = args[2] == "1"; - TChanID channel = inst->getFactionDynChannel(lang); + + string channelName = lang; + // Convert langs to usr lang channels + if (lang == "en" || lang == "fr" || lang == "de" || lang == "ru" || lang == "es") + channelName = "usr_"+lang; + + TChanID channel = inst->getFactionDynChannel(channelName); if (channel != DYN_CHAT_INVALID_CHAN) { diff --git a/ryzom/server/src/entities_game_service/player_manager/persistent_player_data.cpp b/ryzom/server/src/entities_game_service/player_manager/persistent_player_data.cpp index 2c78be3d3..0a0e68d43 100644 --- a/ryzom/server/src/entities_game_service/player_manager/persistent_player_data.cpp +++ b/ryzom/server/src/entities_game_service/player_manager/persistent_player_data.cpp @@ -436,7 +436,7 @@ static void prepareCharacterPositionForStore ( COfflineEntityState & state, cons PROP(uint32,_GuildPoints)\ PROP(uint8,_TodayGuildPoints)\ PROP_GAME_CYCLE_COMP(_NextTodayGuildPointsReset)\ - PROP2(_LangChannel,string,_LangChannel,_LangChannel="rf")\ + PROP2(_LangChannel,string,_LangChannel,_LangChannel=val)\ PROP(uint32,_Organization)\ PROP(uint32,_OrganizationStatus)\ PROP(uint32,_OrganizationPoints)\ diff --git a/ryzom/server/src/entities_game_service/pvp_manager/pvp_manager_2.cpp b/ryzom/server/src/entities_game_service/pvp_manager/pvp_manager_2.cpp index f0d9e0b34..eb8a2350f 100644 --- a/ryzom/server/src/entities_game_service/pvp_manager/pvp_manager_2.cpp +++ b/ryzom/server/src/entities_game_service/pvp_manager/pvp_manager_2.cpp @@ -221,20 +221,21 @@ std::vector CPVPManager2::getCharacterChannels(CCharacter * user) NLMISC::splitString(user->getLangChannel(), " ", langChannels); for ( uint i = 0; i < langChannels.size(); i++ ) { - TMAPExtraFactionChannel::iterator it = _ExtraFactionChannel.find(langChannels[i]); - if (it != _ExtraFactionChannel.end()) + if (langChannels[i] != "rf") { - result.push_back((*it).second); + TMAPExtraFactionChannel::iterator it = _ExtraFactionChannel.find("usr_"+langChannels[i]); + if (it != _ExtraFactionChannel.end()) + { + result.push_back((*it).second); + } } } } - else + + TMAPExtraFactionChannel::iterator it = _ExtraFactionChannel.find("rf"); + if (it != _ExtraFactionChannel.end()) { - TMAPExtraFactionChannel::iterator it = _ExtraFactionChannel.find("en"); - if (it != _ExtraFactionChannel.end()) - { - result.push_back((*it).second); - } + result.push_back((*it).second); } PVP_CLAN::TPVPClan faction = user->getAllegiance().first; @@ -1184,11 +1185,18 @@ void CPVPManager2::onIOSMirrorUp() createExtraFactionChannel("de", true); createExtraFactionChannel("ru", true); createExtraFactionChannel("es", true); + + createExtraFactionChannel("usr_en", true); + createExtraFactionChannel("usr_fr", true); + createExtraFactionChannel("usr_de", true); + createExtraFactionChannel("usr_ru", true); + createExtraFactionChannel("usr_es", true); + createExtraFactionChannel("rf", true); createExtraFactionChannel("rf-fr", true); createExtraFactionChannel("rf-en", true); createExtraFactionChannel("rf-es", true); - createExtraFactionChannel("rf-ed", true); + createExtraFactionChannel("rf-de", true); createExtraFactionChannel("rf-ru", true); #ifdef HAVE_MONGO diff --git a/ryzom/server/src/input_output_service/chat_client.cpp b/ryzom/server/src/input_output_service/chat_client.cpp index 9d6dcae57..716b958a1 100644 --- a/ryzom/server/src/input_output_service/chat_client.cpp +++ b/ryzom/server/src/input_output_service/chat_client.cpp @@ -46,7 +46,7 @@ CChatClient::CChatClient( const TDataSetRow& index ) cm.addGroup(_SayAudienceId, CChatGroup::say, ""); cm.addGroup(_ShoutAudienceId, CChatGroup::shout, ""); - _Muted = false; + _Muted = false; _ChatMode = CChatGroup::say; _SayLastAudienceUpdateTime = CTime::getLocalTime(); _ShoutLastAudienceUpdateTime = _SayLastAudienceUpdateTime; @@ -64,9 +64,9 @@ CChatClient::~CChatClient() } -void CChatClient::setChatMode( CChatGroup::TGroupType mode, TChanID dynChatChan) -{ - _ChatMode = mode; +void CChatClient::setChatMode( CChatGroup::TGroupType mode, TChanID dynChatChan) +{ + _ChatMode = mode; _DynChatChan = dynChatChan; } @@ -126,7 +126,7 @@ bool CChatClient::isMuted() return false; } } - return true; + return true; } } // isMuted // @@ -143,10 +143,10 @@ void CChatClient::setIgnoreStatus( const NLMISC::CEntityId &id, bool ignored) if (ignored) { if( itIgnore == _IgnoreList.end() ) - { + { _IgnoreList.insert( id ); } - + } else { @@ -223,11 +223,11 @@ void CChatClient::filter( TFilter filterId ) // //----------------------------------------------- CChatGroup& CChatClient::getAudience() -{ +{ CChatManager &cm = IOS->getChatManager(); - if(_ChatMode == CChatGroup::shout) - return cm.getGroup(_ShoutAudienceId); - else + if(_ChatMode == CChatGroup::shout) + return cm.getGroup(_ShoutAudienceId); + else return cm.getGroup(_SayAudienceId); } // getAudience // @@ -239,7 +239,7 @@ CChatGroup& CChatClient::getAudience() // //----------------------------------------------- CChatGroup& CChatClient::getSayAudience( bool update ) -{ +{ CChatManager &cm = IOS->getChatManager(); if( update ) { @@ -256,7 +256,7 @@ CChatGroup& CChatClient::getSayAudience( bool update ) // //----------------------------------------------- CChatGroup& CChatClient::getShoutAudience( bool update ) -{ +{ CChatManager &cm = IOS->getChatManager(); if( update ) { @@ -339,8 +339,8 @@ void CChatClient::updateAudience( CEntityId &audienceId, sint maxDist, TTime& la // first of all, check the instance id if (instanceId == charInstanceId) { - CMirrorPropValueRO charCell( TheDataset, entityIndex, DSPropertyCELL ); - + CMirrorPropValueRO charCell( TheDataset, entityIndex, DSPropertyCELL ); + // if the player is NOT in an appartment if( cellS > 0 ) { @@ -349,7 +349,7 @@ void CChatClient::updateAudience( CEntityId &audienceId, sint maxDist, TTime& la uint16 charCellX = (uint16)(charCell>>16); uint16 charCellY = (uint16)(charCell&0xffff); - + sint32 distX = (sint32)(charCellX) - (sint32)(senderCellX); sint32 distY = (sint32)(charCellY) - (sint32)(senderCellY); @@ -409,7 +409,7 @@ void CChatClient::updateAudience( CEntityId &audienceId, sint maxDist, TTime& la } lastAudienceUpdateTime = currentTime; } - + } // updateAudience // @@ -512,13 +512,24 @@ void CChatClient::unsubscribeAllChatGroup() //----------------------------------------------- -// disableTranslation +// disableSendTranslation //----------------------------------------------- -void CChatClient::disableTranslation( const string &lang ) +void CChatClient::disableSendTranslation( const string &lang ) { - if (find(_DontTranslate.begin(), _DontTranslate.end(), lang) == _DontTranslate.end()) + if (find(_DontSendTranslation.begin(), _DontSendTranslation.end(), lang) == _DontSendTranslation.end()) { - _DontTranslate.push_back(lang); + _DontSendTranslation.push_back(lang); + } +} + +//----------------------------------------------- +// disableReceiveTranslation +//----------------------------------------------- +void CChatClient::disableReceiveTranslation( const string &lang ) +{ + if (find(_DontReceiveTranslation.begin(), _DontReceiveTranslation.end(), lang) == _DontReceiveTranslation.end()) + { + _DontReceiveTranslation.push_back(lang); } } @@ -527,16 +538,25 @@ void CChatClient::disableTranslation( const string &lang ) //----------------------------------------------- void CChatClient::resetDisabledTranslations() { - _DontTranslate.clear(); + _DontReceiveTranslation.clear(); + _DontSendTranslation.clear(); } //----------------------------------------------- -// haveDisabledTranslation +// dontReceiveTranslation //----------------------------------------------- -bool CChatClient::haveDisabledTranslation( const string &lang ) +bool CChatClient::dontReceiveTranslation( const string &lang ) { - return find(_DontTranslate.begin(), _DontTranslate.end(), lang) != _DontTranslate.end(); + return find(_DontReceiveTranslation.begin(), _DontReceiveTranslation.end(), lang) != _DontReceiveTranslation.end(); } +//----------------------------------------------- +// dontSendTranslation +//----------------------------------------------- +bool CChatClient::dontSendTranslation( const string &lang ) +{ + return find(_DontSendTranslation.begin(), _DontSendTranslation.end(), lang) != _DontSendTranslation.end(); +} + diff --git a/ryzom/server/src/input_output_service/chat_client.h b/ryzom/server/src/input_output_service/chat_client.h index 71ca325cd..b59e15fad 100644 --- a/ryzom/server/src/input_output_service/chat_client.h +++ b/ryzom/server/src/input_output_service/chat_client.h @@ -33,21 +33,21 @@ typedef uint8 TFilter; - + /** * CChatClient * \author Stephane Coutelas * \author Nevrax France * \date 2002 */ -class CChatClient +class CChatClient { public : - + /** * Constructor */ - CChatClient( const TDataSetRow& id ); + CChatClient( const TDataSetRow& id ); /************************************************************************/ /* Destructor */ /************************************************************************/ @@ -62,7 +62,7 @@ public : */ const TDataSetRow &getDataSetIndex() const { return _DataSetIndex; } - /** + /** * Mute or unmute this client, nobody will received chat from him * the player can be muted for a fixed period of time * If the player is unmuted, the delay is not taken into account @@ -73,7 +73,7 @@ public : /** * Get the mute state of this client - * + * * \return true if this client is muted */ bool isMuted(); @@ -101,7 +101,7 @@ public : * \param filterId the filter */ void filter( TFilter filterId ); - + /** * Return true if the filter is on * \param filterId the filter @@ -109,7 +109,7 @@ public : bool isFilterOn( TFilter filterId ) const; /** - * Set the chat mode + * Set the chat mode * \param mode the chat mode * \param dynChatChan If mode is dyn chat, then gives the channel */ @@ -132,32 +132,32 @@ public : */ // void setChatGroup( TGroupId gId) { _ChatGroup = gId; } - void setTeamChatGroup( TGroupId gId) - { + void setTeamChatGroup( TGroupId gId) + { _TeamChat = gId; } - void setGuildChatGroup( TGroupId gId) - { + void setGuildChatGroup( TGroupId gId) + { _GuildChat = gId; } - void setRegionChatGroup( TGroupId gId) - { + void setRegionChatGroup( TGroupId gId) + { _RegionChat = gId; } - TGroupId getTeamChatGroup() - { + TGroupId getTeamChatGroup() + { return _TeamChat; } - TGroupId getGuildChatGroup() - { + TGroupId getGuildChatGroup() + { return _GuildChat; } - TGroupId getRegionChatGroup() - { + TGroupId getRegionChatGroup() + { return _RegionChat; } - + /** * Get the chat group * \return the group's id @@ -206,12 +206,14 @@ public : // unsubscribe to all chat group void unsubscribeAllChatGroup(); - void disableTranslation( const std::string &lang ); + void disableSendTranslation( const std::string &lang ); + void disableReceiveTranslation( const std::string &lang ); void resetDisabledTranslations(); - bool haveDisabledTranslation( const std::string &lang ); + bool dontReceiveTranslation( const std::string &lang ); + bool dontSendTranslation( const std::string &lang ); private : - + /// CLient datasetrow TDataSetRow _DataSetIndex; /// client character id @@ -275,7 +277,8 @@ private : /// keep infos about which string has been received by the client std::vector _KnownStrings; - std::vector _DontTranslate; + std::vector _DontReceiveTranslation; + std::vector _DontSendTranslation; /** * Update the audience of this client diff --git a/ryzom/server/src/input_output_service/chat_manager.cpp b/ryzom/server/src/input_output_service/chat_manager.cpp index 61639f6f2..7a9f8f76d 100644 --- a/ryzom/server/src/input_output_service/chat_manager.cpp +++ b/ryzom/server/src/input_output_service/chat_manager.cpp @@ -552,6 +552,9 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr ) TClientInfoCont::iterator itCl = _Clients.find( sender ); if( itCl != _Clients.end() ) { + CChatManager &cm = IOS->getChatManager(); + CChatClient &senderClient = cm.getClient(sender); + // if( itCl->second->isMuted() ) CEntityId eid = TheDataset.getEntityId(sender); if(_MutedUsers.find( eid ) != _MutedUsers.end()) @@ -603,6 +606,8 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr ) // clean up container _DestUsers.clear(); + string senderLang = SM->getLanguageCodeString(ci->Language); + switch( itCl->second->getChatMode() ) { // dynamic group @@ -617,8 +622,6 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr ) bool have_es = false; CChatGroup::TMemberCont::iterator itA; - string sender_lang = SM->getLanguageCodeString(ci->Language); - for( itA = itCl->second->getAudience().Members.begin(); itA != itCl->second->getAudience().Members.end(); ++itA ) @@ -639,16 +642,12 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr ) receiver_lang = SM->getLanguageCodeString(co->Language); } - if (EnableDeepL) + if (EnableDeepL && !senderClient.dontSendTranslation(senderLang)) { CChatClient &client = getClient(*itA); - if (sender_lang == "wk") - receiver_lang = sender_lang; - - if (ucstr[0] != '>' && client.haveDisabledTranslation(sender_lang)) - receiver_lang = sender_lang; - + if (senderLang == "wk") + receiver_lang = senderLang; if (ucstr[0] == '>') // Sent directly when prefixed by '>', it's the anti-translation code { @@ -656,7 +655,7 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr ) { string usedlang = ucstr.toString().substr(2, 2); //nlinfo("used: %s, user: %s", usedlang.c_str(), receiver_lang.c_str()); - if (usedlang == receiver_lang && !client.haveDisabledTranslation(sender_lang)) + if (usedlang == receiver_lang && !client.dontReceiveTranslation(usedlang)) sendChat( itCl->second->getChatMode(), *itA, ucstr.substr(5), sender ); } else @@ -664,7 +663,7 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr ) sendChat( itCl->second->getChatMode(), *itA, ucstr.substr(1), sender ); } } - else if (sender_lang == receiver_lang) // Sent directly if sender and receiver uses same lang + else if (senderLang == receiver_lang || client.dontReceiveTranslation(senderLang)) // Sent directly if sender and receiver uses same lang { sendChat( itCl->second->getChatMode(), *itA, ucstr, sender ); } @@ -687,7 +686,7 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr ) sendChat( itCl->second->getChatMode(), *itA, ucstr, sender ); } - string langs = sender_lang; + string langs = senderLang; if (have_fr) langs += "-fr"; if (have_de) @@ -716,11 +715,12 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr ) if (EnableDeepL) { - string sender_lang = SM->getLanguageCodeString(ci->Language); if (ucstr[0] == '>') // Sent directly when prefixed by '>', it's the anti-translation code chatInGroup( grpId, ucstr.substr(1), sender ); + else if (senderClient.dontSendTranslation(senderLang)) + chatInGroup( grpId, ucstr, sender ); else - _Log.displayNL("region:%s|%s|*|%s-*|%s", grpId.toString().c_str(), fullName.c_str(), sender_lang.c_str(), ucstr.toString().c_str() ); + _Log.displayNL("region:%s|%s|*|%s-*|%s", grpId.toString().c_str(), fullName.c_str(), senderLang.c_str(), ucstr.toUtf8().c_str() ); } else chatInGroup( grpId, ucstr, sender ); @@ -761,14 +761,16 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr ) bool sendToMongo = true; bool sendToAllUni = false; - string autosub = "1"; + string autoSub = "1"; uint8 startPos = 0; string mongoText = ucstr.toUtf8(); string chatId = "all"; string chatType = "univers"; - string usedlang = SM->getLanguageCodeString(ci->Language); - if (EnableDeepL) + + string usedlang = senderLang; + + if (EnableDeepL && !senderClient.dontSendTranslation(senderLang)) { chatType = "dynamic"; if (ucstr[0] == '>') // Sent directly when prefixed by '>', it's the anti-translation code @@ -788,7 +790,7 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr ) source_lang = mongoText.substr(6, 2); string sourceText = mongoText.substr(9, endOfOriginal-9); strFindReplace(sourceText, ")", "}"); - mongoText = "["+source_lang+"](http://chatdev.ryzom.com/channel/pub-universe-"+source_lang+"? "+sourceText+") "+mongoText.substr(endOfOriginal+4, mongoText.size()-endOfOriginal-4); + mongoText = "["+source_lang+"](http://chat.ryzom.com/channel/pub-universe-"+source_lang+"? "+sourceText+") "+mongoText.substr(endOfOriginal+4, mongoText.size()-endOfOriginal-4); } else { @@ -796,14 +798,14 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr ) mongoText = mongoText.substr(4, mongoText.size()-4); } - if (source_lang == "en") // in RC the icon are :us: - mongoText = ":us:"+mongoText; + if (source_lang == "en") // in RC the icon are :gb: + mongoText = ":gb:"+mongoText; else mongoText = ":"+source_lang+":"+mongoText; chatId = "FACTION_"+toUpper(usedlang); if (usedlang != SM->getLanguageCodeString(ci->Language)) - autosub = "0"; + autoSub = "0"; } else @@ -813,8 +815,7 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr ) } else { - string sender_lang = SM->getLanguageCodeString(ci->Language); - _Log.displayNL("%s|%s|*|%s-*|%s", "universe", fullName.c_str(), sender_lang.c_str(), ucstr.toUtf8().c_str()); + _Log.displayNL("%s|%s|*|%s-*|%s", "universe", fullName.c_str(), senderLang.c_str(), ucstr.toUtf8().c_str()); sendToMongo = false; } } @@ -826,15 +827,14 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr ) { if (sendToAllUni) { - string userlang = SM->getLanguageCodeString(ci->Language); - CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': '%s', 'chatId': 'FACTION_EN', 'date': %f, 'ig': true, 'autosub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), chatType.c_str(), date, userlang == "en"?"1":"0")); - CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': '%s', 'chatId': 'FACTION_DE', 'date': %f, 'ig': true, 'autosub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), chatType.c_str(), date, userlang == "de"?"1":"0")); - CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': '%s', 'chatId': 'FACTION_ES', 'date': %f, 'ig': true, 'autosub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), chatType.c_str(), date, userlang == "es"?"1":"0")); - CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': '%s', 'chatId': 'FACTION_FR', 'date': %f, 'ig': true, 'autosub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), chatType.c_str(), date, userlang == "fr"?"1":"0")); - CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': '%s', 'chatId': 'FACTION_RU', 'date': %f, 'ig': true, 'autosub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), chatType.c_str(), date, userlang == "ru"?"1":"0")); + CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': '%s', 'chatId': 'FACTION_EN', 'date': %f, 'ig': true, 'autoSub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), chatType.c_str(), date, senderLang == "en"?"1":"0")); + CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': '%s', 'chatId': 'FACTION_DE', 'date': %f, 'ig': true, 'autoSub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), chatType.c_str(), date, senderLang == "de"?"1":"0")); + CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': '%s', 'chatId': 'FACTION_ES', 'date': %f, 'ig': true, 'autoSub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), chatType.c_str(), date, senderLang == "es"?"1":"0")); + CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': '%s', 'chatId': 'FACTION_FR', 'date': %f, 'ig': true, 'autoSub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), chatType.c_str(), date, senderLang == "fr"?"1":"0")); + CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': '%s', 'chatId': 'FACTION_RU', 'date': %f, 'ig': true, 'autoSub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), chatType.c_str(), date, senderLang == "ru"?"1":"0")); } else - CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': '%s', 'chatId': '%s', 'date': %f, 'ig': true, 'autosub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), chatType.c_str(), chatId.c_str(), date, autosub.c_str())); + CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': '%s', 'chatId': '%s', 'date': %f, 'ig': true, 'autoSub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), chatType.c_str(), chatId.c_str(), date, autoSub.c_str())); } #endif @@ -866,7 +866,7 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr ) double date = 1000.0*(double)CTime::getSecondsSince1970(); #ifdef HAVE_MONGO - CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': 'guildId', 'chatId': '%s', 'date': %f, 'ig': true, 'autosub': 1 }", CMongo::quote(fullName).c_str(), CMongo::quote(ucstr.toUtf8()).c_str(), sGuildId.str().c_str(), date)); + CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': 'guildId', 'chatId': '%s', 'date': %f, 'ig': true, 'autoSub': 1 }", CMongo::quote(fullName).c_str(), CMongo::quote(ucstr.toUtf8()).c_str(), sGuildId.str().c_str(), date)); #endif chatInGroup( grpId, ucstr, sender ); } @@ -892,158 +892,186 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr ) } } - const std::string *tmpChatId = _ChanNames.getB(chanId); - string chatId; - if (tmpChatId) - chatId = *tmpChatId; + const std::string *tmpChatId = _ChanNames.getB(chanId); + string chatId; + if (tmpChatId) + chatId = *tmpChatId; - double date = 1000.0*(double)CTime::getSecondsSince1970(); + double date = 1000.0*(double)CTime::getSecondsSince1970(); - bool sendToMongo = true; - bool sendToAllForge = false; - uint8 startPos = 0; - string mongoText = ucstr.toUtf8(); - string usedlang = ""; - string autosub = "0"; + string mongoText = ucstr.toUtf8(); - if (EnableDeepL) - { - if (ucstr[0] == '>') // Sent directly when prefixed by '>', it's the anti-translation code + bool sendMessages = true; + bool sendToAllForge = false; + bool haveOriginMessage = false; + uint8 startPos = 0; + + string originLang = senderLang; + string translatedLang = ""; + string autoSub = "0"; + + if (EnableDeepL) { - startPos = 1; - mongoText = mongoText.substr(1); - string::size_type endOfOriginal = mongoText.find("}@{"); - if (mongoText.size() > 4 && mongoText[0] == ':' && mongoText[3] == ':') + if (senderClient.dontSendTranslation(senderLang)) { - startPos = 5; - usedlang = mongoText.substr(1, 2); - string source_lang = usedlang; - - if (endOfOriginal != string::npos) - { - if (mongoText.size() > 9) - source_lang = mongoText.substr(6, 2); - string sourceText = mongoText.substr(9, endOfOriginal-9); - strFindReplace(sourceText, ")", "}"); - mongoText = "["+source_lang+"](http://chatdev.ryzom.com/channel/pub-forge-"+source_lang+"? "+sourceText+") "+mongoText.substr(endOfOriginal+4, mongoText.size()-endOfOriginal-4); - } - else + sendToAllForge = true; + } + else if (ucstr[0] == '>') // Sent directly when prefixed by '>', it's the anti-translation code + { + startPos = 1; + mongoText = mongoText.substr(1); + string::size_type endOfOriginal = mongoText.find("}@{"); + if (mongoText.size() > 4 && mongoText[0] == ':' && mongoText[3] == ':') { - usedlang = mongoText.substr(1, 2); - mongoText = mongoText.substr(4, mongoText.size()-4); + startPos = 5; + translatedLang = mongoText.substr(1, 2); + + if (endOfOriginal != string::npos) + { + haveOriginMessage = true; + if (mongoText.size() > 9) + originLang = mongoText.substr(6, 2); + string originText = mongoText.substr(9, endOfOriginal-9); + strFindReplace(originText, ")", "}"); + mongoText = "["+originLang+"](http://chat.ryzom.com/channel/pub-forge-"+originLang+"? "+originText+") "+mongoText.substr(endOfOriginal+4, mongoText.size()-endOfOriginal-4); + } + else + { + originLang = translatedLang; + mongoText = mongoText.substr(4, mongoText.size()-4); + } + + if (originLang == "en") // in RC the icon are :gb: + mongoText = ":gb:"+mongoText; + else + mongoText = ":"+originLang+":"+mongoText; } + else if (chatId == "FACTION_RF") // Only when it's a not translated text + sendToAllForge = true; - if (source_lang == "en") // in RC the icon are :us: - mongoText = ":us:"+mongoText; - else - mongoText = ":"+source_lang+":"+mongoText; } - else if (chatId == "FACTION_RF") - sendToAllForge = true; - - } - else if (chatId == "FACTION_RF" || chatId == "FACTION_EN" || chatId == "FACTION_DE" || chatId == "FACTION_FR" || chatId == "FACTION_ES" || chatId == "FACTION_RU") - { - usedlang = SM->getLanguageCodeString(ci->Language); - _Log.displayNL("%s|%s|*|%s-*|%s", string("#"+chatId).c_str(), fullName.c_str(), usedlang.c_str(), ucstr.toUtf8().c_str()); - sendToMongo = false; + // Send for translation + else if (chatId == "FACTION_RF" || chatId == "FACTION_EN" || chatId == "FACTION_DE" || chatId == "FACTION_FR" || chatId == "FACTION_ES" || chatId == "FACTION_RU") + { + _Log.displayNL("%s|%s|*|%s-*|%s", string("#"+chatId).c_str(), fullName.c_str(), senderLang.c_str(), ucstr.toUtf8().c_str()); + sendMessages = false; // We need translated it before + } } - } -#ifdef HAVE_MONGO - if (sendToMongo) // only send to mongo if it's not a translated message + if (sendMessages) // only send to mongo if it's not a message to translate { - string userlang = SM->getLanguageCodeString(ci->Language); +#ifdef HAVE_MONGO + if (sendToAllForge) { - CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': 'dynamic', 'chatId': 'FACTION_RF-EN', 'date': %f, 'ig': true, 'autosub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), date, userlang == "en"?"1":"0")); - CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': 'dynamic', 'chatId': 'FACTION_RF-DE', 'date': %f, 'ig': true, 'autosub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), date, userlang == "de"?"1":"0")); - CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': 'dynamic', 'chatId': 'FACTION_RF-ES', 'date': %f, 'ig': true, 'autosub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), date, userlang == "es"?"1":"0")); - CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': 'dynamic', 'chatId': 'FACTION_RF-FR', 'date': %f, 'ig': true, 'autosub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), date, userlang == "fr"?"1":"0")); - CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': 'dynamic', 'chatId': 'FACTION_RF-RU', 'date': %f, 'ig': true, 'autosub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), date, userlang == "ru"?"1":"0")); - + CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': 'dynamic', 'chatId': 'FACTION_RF-EN', 'date': %f, 'ig': true, 'autoSub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), date, senderLang == "en"?"1":"0")); + CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': 'dynamic', 'chatId': 'FACTION_RF-DE', 'date': %f, 'ig': true, 'autoSub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), date, senderLang == "de"?"1":"0")); + CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': 'dynamic', 'chatId': 'FACTION_RF-ES', 'date': %f, 'ig': true, 'autoSub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), date, senderLang == "es"?"1":"0")); + CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': 'dynamic', 'chatId': 'FACTION_RF-FR', 'date': %f, 'ig': true, 'autoSub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), date, senderLang == "fr"?"1":"0")); + CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': 'dynamic', 'chatId': 'FACTION_RF-RU', 'date': %f, 'ig': true, 'autoSub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), date, senderLang == "ru"?"1":"0")); } else { if (chatId == "FACTION_RF") - chatId = "FACTION_RF-"+toUpper(usedlang); - CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': 'dynamic', 'chatId': '%s', 'date': %f, 'ig': true, 'autosub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), chatId.c_str(), date, userlang == usedlang?"1":"0")); + { + if (translatedLang.empty()) + chatId = "FACTION_RF-"+toUpper(senderLang); + else + chatId = "FACTION_RF-"+toUpper(translatedLang); + } + CMongo::insert("ryzom_chats", toString("{ 'username': '%s', 'chat': '%s', 'chatType': 'dynamic', 'chatId': '%s', 'date': %f, 'ig': true, 'autoSub': %s }", CMongo::quote(fullName).c_str(), CMongo::quote(mongoText).c_str(), chatId.c_str(), date, (translatedLang.empty() || translatedLang == senderLang)?"1":"0")); } - } + #endif - if (!session->getChan()->getDontBroadcastPlayerInputs() && startPos != 0) - { - // add msg to the historic - CDynChatChan::CHistoricEntry entry; - entry.String = ucstr; - if (ci != NULL) - entry.SenderString = ci->Name; - else - entry.SenderString = ""; + if (!session->getChan()->getDontBroadcastPlayerInputs()) + { + // add msg to the historic + CDynChatChan::CHistoricEntry entry; + entry.String = ucstr; + if (ci != NULL) + entry.SenderString = ci->Name; + else + entry.SenderString = ""; - session->getChan()->Historic.push(entry); + session->getChan()->Historic.push(entry); - ucstring content; - if (!session->getChan()->HideBubble) - { //normal case - content = ucstr; - } - else - { - // true for control channel (Ring) - ucstring tmp("{no_bubble}"); - if (ucstr.find(tmp) == ucstring::npos) - { - tmp += ucstr; - content.swap(tmp); + ucstring content; + if (!session->getChan()->HideBubble) + { //normal case + content = ucstr; } else { - content = ucstr; + // true for control channel (Ring) + ucstring tmp("{no_bubble}"); + if (ucstr.find(tmp) == ucstring::npos) + { + tmp += ucstr; + content.swap(tmp); + } + else + { + content = ucstr; + } } - } - - // broadcast to other client in the channel - CDynChatSession *dcc = session->getChan()->getFirstSession(); - while (dcc) + // broadcast to other client in the channel + CDynChatSession *dcc = session->getChan()->getFirstSession(); + while (dcc) + { + NLMISC::CEntityId receiverId = TheDataset.getEntityId(dcc->getClient()->getID()); + CCharacterInfos* co = IOS->getCharInfos(receiverId); + CChatClient &receiverClient = getClient(dcc->getClient()->getID()); + + bool canSendChat = true; + + if (EnableDeepL) + { + if (receiverClient.dontReceiveTranslation(originLang)) + { + if (haveOriginMessage) // Only send untranslated message + canSendChat = false; + } + else if (!translatedLang.empty() && translatedLang != SM->getLanguageCodeString(co->Language)) + canSendChat = false; + } + + if (canSendChat) + sendChat(itCl->second->getChatMode(), dcc->getClient()->getID(), content.substr(startPos), sender, chanId); + dcc = dcc->getNextChannelSession(); // next session in this channel + } + } + else { - NLMISC::CEntityId receiverId = TheDataset.getEntityId(dcc->getClient()->getID()); - CCharacterInfos* co = IOS->getCharInfos(receiverId); - if (!EnableDeepL || usedlang.empty() || usedlang == SM->getLanguageCodeString(co->Language)) - sendChat(itCl->second->getChatMode(), dcc->getClient()->getID(), content.substr(startPos), sender, chanId); - dcc = dcc->getNextChannelSession(); // next session in this channel + // only send an echo to the sender + if (!EnableDeepL) // only send an echo to the sender + sendChat(itCl->second->getChatMode(), itCl->first, ucstr, sender, chanId); } - } - else - { - // only send an echo to the sender - if (!EnableDeepL || usedlang.empty()) // only send an echo to the sender - sendChat(itCl->second->getChatMode(), itCl->first, ucstr, sender, chanId); - } - if (session->getChan()->getForwardPlayerIntputToOwnerService()) - { - // send player input to service owner - NLNET::TServiceId serviceId(chanId.getCreatorId()); + if (session->getChan()->getForwardPlayerIntputToOwnerService()) + { + // send player input to service owner + NLNET::TServiceId serviceId(chanId.getCreatorId()); - TPlayerInputForward pif; - pif.ChanID = chanId; - pif.Sender = sender; - pif.Content = ucstr; + TPlayerInputForward pif; + pif.ChanID = chanId; + pif.Sender = sender; + pif.Content = ucstr; - CMessage msgout( "DYN_CHAT:FORWARD"); - msgout.serial(pif); + CMessage msgout( "DYN_CHAT:FORWARD"); + msgout.serial(pif); - CUnifiedNetwork::getInstance()->send(serviceId, msgout); - } - if (session->getChan()->getUnifiedChannel()) - { - // send the text to other shards - if (IChatUnifierClient::getInstance()) - IChatUnifierClient::getInstance()->sendUnifiedDynChat(session->getChan()->getID(), senderName, ucstr); + CUnifiedNetwork::getInstance()->send(serviceId, msgout); + } + + if (session->getChan()->getUnifiedChannel()) + { + // send the text to other shards + if (IChatUnifierClient::getInstance()) + IChatUnifierClient::getInstance()->sendUnifiedDynChat(session->getChan()->getID(), senderName, ucstr); + } } } } @@ -1098,13 +1126,22 @@ void CChatManager::chatInGroup( TGroupId& grpId, const ucstring& ucstr, const TD list logDest; uint8 startPos = 0; - string usedlang; - if (EnableDeepL && ucstr.length() > 4 && ucstr[0] == ':' && ucstr[3] == ':') // check lang prefix + string usedlang = ""; + string str = ucstr.toString(); + if (EnableDeepL && str.length() > 4 && str[0] == ':' && str[3] == ':') // check lang prefix { - usedlang = ucstr.toString().substr(1, 2); + usedlang = str.substr(1, 2); startPos = 4; } + bool areOriginal = true; + string originLang = usedlang; + if (EnableDeepL && str.length() > 8 && str[4] == '{' && str[5] == ':' && str[8] == ':') // check lang origin + { + areOriginal = false; + originLang = str.substr(6, 2); + } + for( itM = chatGrp.Members.begin(); itM != chatGrp.Members.end(); ++itM ) { CMirrorPropValueRO instanceId( TheDataset, *itM, DSPropertyAI_INSTANCE ); @@ -1113,7 +1150,14 @@ void CChatManager::chatInGroup( TGroupId& grpId, const ucstring& ucstr, const TD { NLMISC::CEntityId receiverId = TheDataset.getEntityId(*itM); CCharacterInfos* co = IOS->getCharInfos(receiverId); - if (usedlang != SM->getLanguageCodeString(co->Language)) + CChatClient &client = getClient(*itM); + + if (client.dontReceiveTranslation(originLang)) + { + if (!areOriginal) + continue; + } + else if (usedlang != SM->getLanguageCodeString(co->Language)) continue; } @@ -1907,7 +1951,7 @@ void CChatManager::sendFarChat(const string &name, const ucstring& ucstr, const source_lang = mongoText.substr(6, 2); string sourceText = mongoText.substr(9, endOfOriginal-9); strFindReplace(sourceText, ")", "}"); - mongoText = "["+source_lang+"](http://chatdev.ryzom.com/channel/"+rc_channel+source_lang+"? "+sourceText+") "+mongoText.substr(endOfOriginal+4, mongoText.size()-endOfOriginal-4); + mongoText = "["+source_lang+"](http://chat.ryzom.com/channel/"+rc_channel+source_lang+"? "+sourceText+") "+mongoText.substr(endOfOriginal+4, mongoText.size()-endOfOriginal-4); } else { @@ -1916,8 +1960,8 @@ void CChatManager::sendFarChat(const string &name, const ucstring& ucstr, const } - if (source_lang == "en") // in RC the icon are :us: - mongoText = ":us:"+mongoText; + if (source_lang == "en") // in RC the icon are :gb: + mongoText = ":gb:"+mongoText; else mongoText = ":"+source_lang+":"+mongoText; diff --git a/ryzom/server/src/input_output_service/messages.cpp b/ryzom/server/src/input_output_service/messages.cpp index 416f8e964..ca7988caa 100644 --- a/ryzom/server/src/input_output_service/messages.cpp +++ b/ryzom/server/src/input_output_service/messages.cpp @@ -65,7 +65,7 @@ void cbImpulsionReadyString( CMessage& msgin, const string &serviceName, TServic msgin.serial(sender); msgin.serial(nbBitsToSkip); msgin.serialMemStream(bms); - + // Unpack bitmemstream uint32 xmlcode; bms.serial(xmlcode, nbBitsToSkip); // the XML code was already read by tbe sender service @@ -179,7 +179,7 @@ void cbImpulsionChatTeam( CMessage& msgin, const string &serviceName, TServiceId } try - { + { TDataSetRow senderRow = TheDataset.getDataSetRow(sender); // get current chat mode const CChatGroup::TGroupType chatModeBck = IOS->getChatManager().getClient(senderRow).getChatMode(); @@ -189,7 +189,7 @@ void cbImpulsionChatTeam( CMessage& msgin, const string &serviceName, TServiceId // send the message IOS->getChatManager().chat( senderRow, ucstr ); // reset chat mode to old value - IOS->getChatManager().getClient(senderRow).setChatMode( chatModeBck ); + IOS->getChatManager().getClient(senderRow).setChatMode( chatModeBck ); } catch(const Exception &e) { @@ -240,19 +240,19 @@ void cbImpulsionTell( CMessage& msgin, const string &serviceName, TServiceId ser static void updateIgnoreStatus(CMessage& msgin, const string &serviceName, TServiceId serviceId, bool ignored) { CEntityId senderId; - CEntityId ignoredId; - + CEntityId ignoredId; + try { msgin.serial(senderId); msgin.serial(ignoredId); - IOS->getChatManager().getClient(TheDataset.getDataSetRow(senderId)).setIgnoreStatus(ignoredId, ignored); + IOS->getChatManager().getClient(TheDataset.getDataSetRow(senderId)).setIgnoreStatus(ignoredId, ignored); } catch(const Exception &e) { nlwarning(" %s",e.what()); return; - } + } } //----------------------------------------------- @@ -261,7 +261,7 @@ static void updateIgnoreStatus(CMessage& msgin, const string &serviceName, TServ //----------------------------------------------- void cbImpulsionIgnore( CMessage& msgin, const string &serviceName, TServiceId serviceId ) { - updateIgnoreStatus(msgin, serviceName, serviceId, true); + updateIgnoreStatus(msgin, serviceName, serviceId, true); } // impulsionIgnore // //----------------------------------------------- @@ -281,7 +281,7 @@ void cbImpulsionUnignoreAll( CMessage& msgin, const string &serviceName, TServic { CEntityId senderId; vector ignoredIds; - + try { msgin.serial(senderId); @@ -366,7 +366,7 @@ void cbImpulsionChatMode( CMessage& msgin, const string &serviceName, TServiceId msgin.serial(sender); uint8 chatMode; - TChanID chanID; + TChanID chanID; try { msgin.serial( chatMode ); @@ -393,8 +393,8 @@ void cbImpulsionChatMode( CMessage& msgin, const string &serviceName, TServiceId IOS->getChatManager().getClient(TheDataset.getDataSetRow(sender)).setChatMode( static_cast(chatMode)); nldebug("IOS: Chat mode --> %s", DebugChatModeName[chatMode]); break; - case CChatGroup::dyn_chat: - IOS->getChatManager().getClient(TheDataset.getDataSetRow(sender)).setChatMode( static_cast(chatMode), chanID); + case CChatGroup::dyn_chat: + IOS->getChatManager().getClient(TheDataset.getDataSetRow(sender)).setChatMode( static_cast(chatMode), chanID); break; default: if (chatMode < CChatGroup::nbChatMode) @@ -542,7 +542,7 @@ static void cbChatMessage(CMessage& msgin, const string &serviceName, TServiceId CChatGroup::TGroupType oldMode = IOS->getChatManager().getClient(entityId).getChatMode(); if ( oldMode != CChatGroup::say ) IOS->getChatManager().getClient(entityId).setChatMode(CChatGroup::say); - + IOS->getChatManager().getClient(entityId).updateAudience(); IOS->getChatManager().chat( entityId, str ); @@ -620,7 +620,7 @@ static void cbCharacterNameId(CMessage& msgin, const string &serviceName, TServi { // read character id msgin.serial( chId ); - + // character's string Id msgin.serial( stringId ); } @@ -630,7 +630,7 @@ static void cbCharacterNameId(CMessage& msgin, const string &serviceName, TServi return; } IOS->addCharacterName( chId, SM->getString( stringId ), TSessionId(0) ); - + } // cbCharacterNameId // //----------------------------------------------- @@ -777,7 +777,7 @@ static void cbAddNamedGroup( CMessage& msgin, const string &serviceName, TServic IOS->getChatManager().addGroup( gId, (CChatGroup::TGroupType)gType, name ); if (VerboseChatManagement) - nldebug("IOS: cbAddGroup Adding named group %s with type '%s' as '%s'", + nldebug("IOS: cbAddGroup Adding named group %s with type '%s' as '%s'", gId.toString().c_str(), CChatGroup::groupTypeToString((CChatGroup::TGroupType)gType).c_str(), name.c_str()); @@ -913,7 +913,7 @@ static void cbRemoveFromGroup( CMessage& msgin, const string &serviceName, TServ // { // try // { -// if( IOS->getChatManager().getClient(clientInfos->DataSetIndex).knowString(entityInfos->OldNameIndex) == false ) +// if( IOS->getChatManager().getClient(clientInfos->DataSetIndex).knowString(entityInfos->OldNameIndex) == false ) // { // IOS->getChatManager().addDynStr( clientId, entityInfos->OldNameIndex, serviceId ); // } @@ -1022,13 +1022,13 @@ void cbNpcTellEx( CMessage& msgin, const string &serviceName, TServiceId service TDataSetRow sender; TDataSetRow receiver; uint32 phraseId; - + msgin.serial(sender); msgin.serial(receiver); msgin.serial(phraseId); - + CChatManager &cm = IOS->getChatManager(); - + try { // TDataSetRow dsr = TheDataset.getDataSetRow(sender); @@ -1056,19 +1056,19 @@ void cbNpcChatEx( CMessage& msgin, const string &serviceName, TServiceId service TDataSetRow sender; CChatGroup::TGroupType type = CChatGroup::nbChatMode; uint32 phraseId; - + msgin.serial(sender); msgin.serialEnum(type); msgin.serial(phraseId); - + CChatManager &cm = IOS->getChatManager(); - + try { // TDataSetRow dsr = TheDataset.getDataSetRow(sender); if (sender == INVALID_DATASET_ROW) { - nlwarning("cbNpcChatEx : ignoring chat because NPC %s:%x Invalid", + nlwarning("cbNpcChatEx : ignoring chat because NPC %s:%x Invalid", TheDataset.getEntityId(sender).toString().c_str(), sender.getIndex()); return; @@ -1106,7 +1106,7 @@ void cbNpcChat( CMessage& msgin, const string &serviceName, TServiceId serviceId // TDataSetRow dsr = TheDataset.getDataSetRow(sender); if ( !sender.isValid() || !TheDataset.isDataSetRowStillValid(sender) ) { - nlwarning("cbNpcChat : ignoring chat because NPC %x not yet/not anymore in mirror", + nlwarning("cbNpcChat : ignoring chat because NPC %x not yet/not anymore in mirror", sender.getIndex()); return; } @@ -1153,7 +1153,7 @@ void cbNpcChatParam( CMessage& msgin, const string &serviceName, NLNET::TService // TDataSetRow dsr = TheDataset.getDataSetRow(sender); if ( !sender.isValid() || !TheDataset.isDataSetRowStillValid(sender) ) { - nlwarning("cbNpcChat : ignoring chat because NPC %x not yet/not anymore in mirror", + nlwarning("cbNpcChat : ignoring chat because NPC %x not yet/not anymore in mirror", sender.getIndex()); return; } @@ -1190,7 +1190,7 @@ void cbNpcChatSentence( CMessage& msgin, const string &serviceName, TServiceId s // TDataSetRow dsr = TheDataset.getDataSetRow(sender); if ( !sender.isValid() || !TheDataset.isDataSetRowStillValid(sender) ) { - nlwarning("cbNpcChatSentence : ignoring chat because NPC %x not yet/not anymore in mirror", + nlwarning("cbNpcChatSentence : ignoring chat because NPC %x not yet/not anymore in mirror", sender.getIndex()); return; } @@ -1247,7 +1247,7 @@ void cbNpcChatSentenceChannel( CMessage& msgin, const string &serviceName, TServ msgin.serial(id); msgin.serial(sender); msgin.serial(sentence); - + if(sender.isValid()) { CChatManager &cm = IOS->getChatManager(); @@ -1287,7 +1287,7 @@ void cbGroupDynString( CMessage& msgin, const string &serviceName, TServiceId se nlwarning("cbGroupDynString : ignoring group message because entity %x not yet in mirror", sender.getIndex()); return; } - + list receiverList; CChatClient &client = cm.getClient(sender); @@ -1297,7 +1297,7 @@ void cbGroupDynString( CMessage& msgin, const string &serviceName, TServiceId se CChatGroup::TMemberCont::iterator itM; for( itM = group.Members.begin(); itM != group.Members.end(); ++itM ) { - const CEntityId &id = TheDataset.getEntityId(*itM); + const CEntityId &id = TheDataset.getEntityId(*itM); // skip it if excluded if ( std::find(excluded.begin(), excluded.end(), id) != excluded.end() ) @@ -1317,7 +1317,7 @@ void cbGroupDynString( CMessage& msgin, const string &serviceName, TServiceId se msgout.serialBufferWithSize((uint8*)bms.buffer(), bms.length()); CUnifiedNetwork::getInstance()->send( TServiceId(id.getDynamicId()), msgout ); } - } + } } catch(const CChatManager::EChatClient &) { @@ -1476,9 +1476,9 @@ void cbEmoteCrowd( CMessage& msgin, const string &serviceName, TServiceId servic string phraseTextId; TVectorParamCheck params; vector ignored; - + CChatManager &cm = IOS->getChatManager(); - + try { msgin.serial(sender); @@ -1534,9 +1534,9 @@ void cbCustomEmote( CMessage& msgin, const string &serviceName, TServiceId servi { TDataSetRow sender; ucstring emoteCustomText; - + CChatManager &cm = IOS->getChatManager(); - + try { msgin.serial(sender); @@ -1544,7 +1544,7 @@ void cbCustomEmote( CMessage& msgin, const string &serviceName, TServiceId servi // filter emote text emoteCustomText = IOS->getChatManager().filterClientInputColorCode(emoteCustomText); - + // get the player if ( sender == TDataSetRow::createFromRawIndex(INVALID_DATASET_ROW) ) { @@ -1638,7 +1638,7 @@ void addSession(TDataSetRow client,TChanID chan,bool writeRight) IOS->getChatManager().addClient( client ); } CDynChatSession *session = IOS->getChatManager().getDynChat().addSession(chan, client); - if (!session) + if (!session) { nlwarning("Couldn't create session"); return; @@ -1665,7 +1665,7 @@ void cbDynChatAddSession(CMessage& msgin, const string &serviceName, TServiceId IOS->getChatManager().addClient( client ); } CDynChatSession *session = IOS->getChatManager().getDynChat().addSession(chan, client); - if (!session) + if (!session) { nlwarning("Couldn't create session"); return; @@ -1691,7 +1691,7 @@ void cbDynChatAddSessionWithName(CMessage& msgin, const string &serviceName, TSe msgin.serial(chan); msgin.serial(clientName); msgin.serial(writeRight); - + if(chan.isUnknownId()) { nlwarning("unknown channel id! unable to add session!"); @@ -1707,7 +1707,7 @@ void cbDynChatAddSessionWithName(CMessage& msgin, const string &serviceName, TSe IOS->getChatManager().addClient( client ); CDynChatSession *session = IOS->getChatManager().getDynChat().addSession(chan, client); - if (!session) + if (!session) { nlwarning("Couldn't create session"); return; @@ -1730,9 +1730,9 @@ void cbDynChatAddSessionWithName(CMessage& msgin, const string &serviceName, TSe void cbDynChatRemoveSession(CMessage& msgin, const string &serviceName, TServiceId serviceId) { TChanID chan; - TDataSetRow client; + TDataSetRow client; msgin.serial(chan); - msgin.serial(client); + msgin.serial(client); bool res = IOS->getChatManager().getDynChat().removeSession(chan, client); if (!res) nlwarning("Couldn't remove session"); } @@ -1745,7 +1745,7 @@ void cbDynChatRemoveSessionWithName(CMessage& msgin, const string &serviceName, { TChanID chan; ucstring clientName; - TDataSetRow client; + TDataSetRow client; msgin.serial(chan); msgin.serial(clientName); CCharacterInfos* cInfo = IOS->getCharInfos(clientName); @@ -1760,9 +1760,9 @@ void cbDynChatRemoveSessionWithName(CMessage& msgin, const string &serviceName, return; }*/ bool res = IOS->getChatManager().getDynChat().removeSession(chan, client); - if (!res) nlwarning("Couldn't remove session"); + if (!res) nlwarning("Couldn't remove session"); } - + } //----------------------------------------------- @@ -1772,10 +1772,10 @@ void cbDynChatRemoveSessionWithName(CMessage& msgin, const string &serviceName, void cbDynChatSetWriteRight(CMessage& msgin, const string &serviceName, TServiceId serviceId) { TChanID chan; - TDataSetRow client; + TDataSetRow client; bool writeRight; msgin.serial(chan); - msgin.serial(client); + msgin.serial(client); msgin.serial(writeRight); CDynChatSession *session = IOS->getChatManager().getDynChat().getSession(chan, client); if (!session) @@ -1794,7 +1794,7 @@ void cbDynChatSetHistoricSize(CMessage& msgin, const string &serviceName, TServi TChanID chanID; uint32 historicSize; msgin.serial(chanID); - msgin.serial(historicSize); + msgin.serial(historicSize); CDynChatChan *chan = IOS->getChatManager().getDynChat().getChan(chanID); if (!chan) { @@ -1807,10 +1807,10 @@ void cbDynChatSetHideBubble(CMessage& msgin, const string &serviceName, TService { TChanID chanID; bool hideBubble; - + msgin.serial(chanID); msgin.serial(hideBubble); - + CChatManager &cm = IOS->getChatManager(); CDynChatChan *chan = cm.getDynChat().getChan(chanID); if (!chan) @@ -1825,10 +1825,10 @@ void cbDynChatSetUniversalChannel(CMessage& msgin, const string &serviceName, TS { TChanID chanID; bool universalChannel; - + msgin.serial(chanID); msgin.serial(universalChannel); - + CChatManager &cm = IOS->getChatManager(); CDynChatChan *chan = cm.getDynChat().getChan(chanID); if (!chan) @@ -1868,10 +1868,10 @@ void cbDynChatServiceChat(CMessage& msgin, const string &serviceName, TServiceId if(!dcc) nlwarning(("nobody hears on channel "+chanID.toString()).c_str()); while (dcc) - { + { cm.sendChat(CChatGroup::dyn_chat, dcc->getClient()->getID(), text, TDataSetRow(), chanID, senderName); dcc = dcc->getNextChannelSession(); // next session in this channel - } + } } void cbDynChatServiceTell(CMessage& msgin, const string &serviceName, TServiceId serviceId) @@ -1908,7 +1908,7 @@ void cbDynChatServiceTell(CMessage& msgin, const string &serviceName, TServiceId break; } dcc = dcc->getNextChannelSession(); // next session in this channel - } + } } //----------------------------------------------- @@ -1921,7 +1921,7 @@ void cbDynChatReset(CMessage& msgin, const string &serviceName, TServiceId servi } //----------------------------------------------- -// update the alias list +// update the alias list // //----------------------------------------------- void cbUpdateAIAlias(CMessage& msgin, const string &serviceName, TServiceId serviceId) @@ -1932,22 +1932,22 @@ void cbUpdateAIAlias(CMessage& msgin, const string &serviceName, TServiceId serv uint32 subcommand; msgin.serial(subcommand); - + switch(subcommand) - { + { case Set: IOS->getAIAliasManager().clear(); case Add: { - + uint32 size; msgin.serial(size); uint first = 0; uint last = size; for ( ;first != last; ++first) - { + { uint32 alias; std::string name; msgin.serial(alias); @@ -1956,7 +1956,7 @@ void cbUpdateAIAlias(CMessage& msgin, const string &serviceName, TServiceId serv } } break; - + /* case Add: break; case Delete: break; @@ -2006,7 +2006,7 @@ void cbUserDontTranslateLanguages( CMessage& msgin, const string &serviceName, T if (player == INVALID_DATASET_ROW) { - nlwarning("cbUserTranslateLanguage : ignoring chat because Player %s:%x Invalid", + nlwarning("cbUserTranslateLanguage : ignoring chat because Player %s:%x Invalid", TheDataset.getEntityId(player).toString().c_str(), player.getIndex()); return; @@ -2019,12 +2019,19 @@ void cbUserDontTranslateLanguages( CMessage& msgin, const string &serviceName, T CChatClient &client = cm.getClient(player); + nlinfo("USER DISBALED TRANSLATIONS: %s", langs.c_str()); vector vlangs; NLMISC::splitString(langs, "|", vlangs); client.resetDisabledTranslations(); for (uint i=0; i') + client.disableSendTranslation(vlangs[i].substr(1)); + else if (vlangs[i][0] == '<') + client.disableReceiveTranslation(vlangs[i].substr(1)); + } } } @@ -2071,7 +2078,7 @@ TUnifiedCallbackItem CbIOSArray[]= // { "READY_STRING", cbImpulsionReadyString }, { "CLIENT:STRING:CHAT", cbImpulsionChat }, { "CLIENT:STRING:CHAT_TEAM", cbImpulsionChatTeam }, - { "CLIENT:STRING:TELL", cbImpulsionTell }, + { "CLIENT:STRING:TELL", cbImpulsionTell }, { "CLIENT:STRING:FILTER", cbImpulsionFilter }, { "CLIENT:STRING:CHAT_MODE", cbImpulsionChatMode }, { "CLIENT:STRING:AFK_TXT", cbImpulsionAfkTxt }, @@ -2092,8 +2099,8 @@ TUnifiedCallbackItem CbIOSArray[]= { "REMOVE_FROM_GROUP", cbRemoveFromGroup }, // { "SEND_DYNAMIC_ID", cbSendDynamicId }, { "CHAT", cbSysChat }, // talk to a user or a whole group - - { "NPC_CHAT", cbNpcChat }, // Npc talk to a chat group + + { "NPC_CHAT", cbNpcChat }, // Npc talk to a chat group { "NPC_CHAT_PARAM", cbNpcChatParam }, // Npc talk to a chat group (with parameter) { "NPC_TELL", cbNpcTell }, // Npc tell to a player @@ -2104,7 +2111,7 @@ TUnifiedCallbackItem CbIOSArray[]= { "NPC_CHAT_SENTENCE", cbNpcChatSentence}, //Npc chat. receive the sentence to chat { "NPC_CHAT_SENTENCE_CHANNEL",cbNpcChatSentenceChannel}, { "NPC_CHAT_SENTENCE_EX",cbNpcChatSentenceEx},//Npc chat. receive the name of the npc which talks, and the sentence - + { "GROUP_DYN_STRING", cbGroupDynString }, // send a system dynamic string to a group { "PHRASE", cbPhrasePrepare }, { "PHRASE_DEBUG", cbPhrasePrepareDebug }, @@ -2130,7 +2137,7 @@ TUnifiedCallbackItem CbIOSArray[]= { "EMOTE_CROWD", cbEmoteCrowd }, // EGS wants IOS to dispatch an emote texte to all users around the "emoting" player { "EMOTE_PLAYER", cbEmoteSolePlayer }, // EGS wants IOS to dispatch an emote texte to a unique player { "CUSTOM_EMOTE", cbCustomEmote }, // EGS wants IOS to dispatch an emote custom text to all users around - + { "SET_PHRASE", cbSetPhrase }, // AIS wants IOS to change a phrase content { "SET_PHRASE_LANG", cbSetPhraseLang }, // AIS or EGS wants IOS to change a phrase content for a language