mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-06-19 11:54:22 -04:00
Added functions for hadling particular lobbies types to ChatHandler
This commit is contained in:
parent
194878a358
commit
8624c9374d
2 changed files with 106 additions and 5 deletions
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include <retroshare/rspeers.h>
|
#include <retroshare/rspeers.h>
|
||||||
#include <retroshare/rsidentity.h>
|
#include <retroshare/rsidentity.h>
|
||||||
|
#include <retroshare/rshistory.h>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
@ -158,6 +159,10 @@ ChatHandler::ChatHandler(StateTokenServer *sts, RsNotify *notify, RsMsgs *msgs,
|
||||||
addResourceHandler("initiate_distant_chat", this, &ChatHandler::handleInitiateDistantChatConnexion);
|
addResourceHandler("initiate_distant_chat", this, &ChatHandler::handleInitiateDistantChatConnexion);
|
||||||
addResourceHandler("distant_chat_status", this, &ChatHandler::handleDistantChatStatus);
|
addResourceHandler("distant_chat_status", this, &ChatHandler::handleDistantChatStatus);
|
||||||
addResourceHandler("close_distant_chat", this, &ChatHandler::handleCloseDistantChatConnexion);
|
addResourceHandler("close_distant_chat", this, &ChatHandler::handleCloseDistantChatConnexion);
|
||||||
|
|
||||||
|
addResourceHandler("private_lobbies", this, &ChatHandler::handlePrivateLobbies);
|
||||||
|
addResourceHandler("subscribed_public_lobbies", this, &ChatHandler::handleSubscribedPublicLobbies);
|
||||||
|
addResourceHandler("unsubscribed_public_lobbies", this, &ChatHandler::handleUnsubscribedPublicLobbies);
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatHandler::~ChatHandler()
|
ChatHandler::~ChatHandler()
|
||||||
|
@ -928,15 +933,19 @@ void ChatHandler::handleMessages(Request &req, Response &resp)
|
||||||
* doing it? */
|
* doing it? */
|
||||||
tick();
|
tick();
|
||||||
|
|
||||||
|
std::string chat_id;
|
||||||
|
req.mStream << makeKeyValueReference("chat_id", chat_id);
|
||||||
|
ChatId id(chat_id);
|
||||||
|
|
||||||
{
|
{
|
||||||
RS_STACK_MUTEX(mMtx); /********** LOCKED **********/
|
RS_STACK_MUTEX(mMtx); /********** LOCKED **********/
|
||||||
ChatId id(req.mPath.top());
|
|
||||||
// make response a list
|
// make response a list
|
||||||
resp.mDataStream.getStreamToMember();
|
resp.mDataStream.getStreamToMember();
|
||||||
if(id.isNotSet())
|
if(id.isNotSet())
|
||||||
{
|
{
|
||||||
resp.setFail("\""+req.mPath.top()+"\" is not a valid chat id");
|
resp.setFail("\""+chat_id+"\" is not a valid chat id");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
std::map<ChatId, std::list<Msg> >::iterator mit = mMsgs.find(id);
|
std::map<ChatId, std::list<Msg> >::iterator mit = mMsgs.find(id);
|
||||||
if(mit == mMsgs.end())
|
if(mit == mMsgs.end())
|
||||||
|
@ -973,10 +982,14 @@ void ChatHandler::handleSendMessage(Request &req, Response &resp)
|
||||||
void ChatHandler::handleMarkChatAsRead(Request &req, Response &resp)
|
void ChatHandler::handleMarkChatAsRead(Request &req, Response &resp)
|
||||||
{
|
{
|
||||||
RS_STACK_MUTEX(mMtx); /********** LOCKED **********/
|
RS_STACK_MUTEX(mMtx); /********** LOCKED **********/
|
||||||
ChatId id(req.mPath.top());
|
|
||||||
|
std::string chat_id;
|
||||||
|
req.mStream << makeKeyValueReference("chat_id", chat_id);
|
||||||
|
ChatId id(chat_id);
|
||||||
|
|
||||||
if(id.isNotSet())
|
if(id.isNotSet())
|
||||||
{
|
{
|
||||||
resp.setFail("\""+req.mPath.top()+"\" is not a valid chat id");
|
resp.setFail("\""+chat_id+"\" is not a valid chat id");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
std::map<ChatId, std::list<Msg> >::iterator mit = mMsgs.find(id);
|
std::map<ChatId, std::list<Msg> >::iterator mit = mMsgs.find(id);
|
||||||
|
@ -1197,4 +1210,88 @@ void ChatHandler::handleCloseDistantChatConnexion(Request& req, Response& resp)
|
||||||
else resp.setFail("Failed to close distant chat");
|
else resp.setFail("Failed to close distant chat");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ChatHandler::handlePrivateLobbies(Request &req, Response &resp)
|
||||||
|
{
|
||||||
|
tick();
|
||||||
|
|
||||||
|
{
|
||||||
|
RS_STACK_MUTEX(mMtx); /********** LOCKED **********/
|
||||||
|
resp.mDataStream.getStreamToMember();
|
||||||
|
for(std::vector<Lobby>::iterator vit = mLobbies.begin(); vit != mLobbies.end(); ++vit)
|
||||||
|
{
|
||||||
|
if(!vit->is_private)
|
||||||
|
continue;
|
||||||
|
uint32_t unread_msgs = 0;
|
||||||
|
ChatId chat_id(vit->id);
|
||||||
|
std::map<ChatId, std::list<Msg> >::iterator mit = mMsgs.find(chat_id);
|
||||||
|
if(mit != mMsgs.end())
|
||||||
|
{
|
||||||
|
std::list<Msg>& msgs = mit->second;
|
||||||
|
for(std::list<Msg>::iterator lit = msgs.begin(); lit != msgs.end(); ++lit)
|
||||||
|
if(!lit->read)
|
||||||
|
unread_msgs++;
|
||||||
|
}
|
||||||
|
resp.mDataStream.getStreamToMember() << *vit << makeKeyValueReference("unread_msg_count", unread_msgs);
|
||||||
|
}
|
||||||
|
resp.mStateToken = mLobbiesStateToken;
|
||||||
|
}
|
||||||
|
resp.setOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatHandler::handleSubscribedPublicLobbies(Request &req, Response &resp)
|
||||||
|
{
|
||||||
|
tick();
|
||||||
|
|
||||||
|
{
|
||||||
|
RS_STACK_MUTEX(mMtx); /********** LOCKED **********/
|
||||||
|
resp.mDataStream.getStreamToMember();
|
||||||
|
for(std::vector<Lobby>::iterator vit = mLobbies.begin(); vit != mLobbies.end(); ++vit)
|
||||||
|
{
|
||||||
|
if(!vit->subscribed || vit->is_private || vit->is_broadcast)
|
||||||
|
continue;
|
||||||
|
uint32_t unread_msgs = 0;
|
||||||
|
ChatId chat_id(vit->id);
|
||||||
|
std::map<ChatId, std::list<Msg> >::iterator mit = mMsgs.find(chat_id);
|
||||||
|
if(mit != mMsgs.end())
|
||||||
|
{
|
||||||
|
std::list<Msg>& msgs = mit->second;
|
||||||
|
for(std::list<Msg>::iterator lit = msgs.begin(); lit != msgs.end(); ++lit)
|
||||||
|
if(!lit->read)
|
||||||
|
unread_msgs++;
|
||||||
|
}
|
||||||
|
resp.mDataStream.getStreamToMember() << *vit << makeKeyValueReference("unread_msg_count", unread_msgs);
|
||||||
|
}
|
||||||
|
resp.mStateToken = mLobbiesStateToken;
|
||||||
|
}
|
||||||
|
resp.setOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatHandler::handleUnsubscribedPublicLobbies(Request &req, Response &resp)
|
||||||
|
{
|
||||||
|
tick();
|
||||||
|
|
||||||
|
{
|
||||||
|
RS_STACK_MUTEX(mMtx); /********** LOCKED **********/
|
||||||
|
resp.mDataStream.getStreamToMember();
|
||||||
|
for(std::vector<Lobby>::iterator vit = mLobbies.begin(); vit != mLobbies.end(); ++vit)
|
||||||
|
{
|
||||||
|
if(vit->subscribed || vit->is_private)
|
||||||
|
continue;
|
||||||
|
uint32_t unread_msgs = 0;
|
||||||
|
ChatId chat_id(vit->id);
|
||||||
|
std::map<ChatId, std::list<Msg> >::iterator mit = mMsgs.find(chat_id);
|
||||||
|
if(mit != mMsgs.end())
|
||||||
|
{
|
||||||
|
std::list<Msg>& msgs = mit->second;
|
||||||
|
for(std::list<Msg>::iterator lit = msgs.begin(); lit != msgs.end(); ++lit)
|
||||||
|
if(!lit->read)
|
||||||
|
unread_msgs++;
|
||||||
|
}
|
||||||
|
resp.mDataStream.getStreamToMember() << *vit << makeKeyValueReference("unread_msg_count", unread_msgs);
|
||||||
|
}
|
||||||
|
resp.mStateToken = mLobbiesStateToken;
|
||||||
|
}
|
||||||
|
resp.setOk();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace resource_api
|
} // namespace resource_api
|
||||||
|
|
|
@ -133,6 +133,10 @@ private:
|
||||||
void handleDistantChatStatus(Request& req, Response& resp);
|
void handleDistantChatStatus(Request& req, Response& resp);
|
||||||
void handleCloseDistantChatConnexion(Request& req, Response& resp);
|
void handleCloseDistantChatConnexion(Request& req, Response& resp);
|
||||||
|
|
||||||
|
void handlePrivateLobbies(Request &req, Response &resp);
|
||||||
|
void handleSubscribedPublicLobbies(Request &req, Response &resp);
|
||||||
|
void handleUnsubscribedPublicLobbies(Request &req, Response &resp);
|
||||||
|
|
||||||
void getPlainText(const std::string& in, std::string &out, std::vector<Triple> &links);
|
void getPlainText(const std::string& in, std::string &out, std::vector<Triple> &links);
|
||||||
// last parameter is only used for lobbies!
|
// last parameter is only used for lobbies!
|
||||||
void locked_storeTypingInfo(const ChatId& chat_id, std::string status, RsGxsId lobby_gxs_id = RsGxsId());
|
void locked_storeTypingInfo(const ChatId& chat_id, std::string status, RsGxsId lobby_gxs_id = RsGxsId());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue