Recommiting from old repo:

commit msg from last:

Fixed minor bug in group creation
msg now set to unread and unprocessed on creation (added read flag in gxsflags.h also)
Got topic and post generation working 

Additional changes:

Voting update now working

git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.5-gxs-b1@5951 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
chrisparker126 2012-12-08 21:50:13 +00:00
parent 0c49fba4d8
commit 6527aaf2d8
8 changed files with 323 additions and 215 deletions

View File

@ -1264,6 +1264,7 @@ void RsGenExchange::publishMsgs()
msg->metaData->serialise(metaDataBuff, &size);
msg->meta.setBinData(metaDataBuff, size);
msg->metaData->mMsgStatus = GXS_SERV::GXS_MSG_STATUS_UNPROCESSED | GXS_SERV::GXS_MSG_STATUS_UNREAD;
msgId = msg->msgId;
grpId = msg->grpId;
mDataAccess->addMsgData(msg);
@ -1322,9 +1323,11 @@ void RsGenExchange::publishGrps()
int i = 0;
for(; mit != mGrpsToPublish.end(); mit++)
{
if(i > GEN_EXCH_GRP_CHUNK-1) break;
toRemove.push_back(mit->first);
i++;
if(i > GEN_EXCH_GRP_CHUNK) break;
RsNxsGrp* grp = new RsNxsGrp(mServType);
RsGxsGrpItem* grpItem = mit->second;

View File

@ -403,20 +403,20 @@ public:
void setGroupServiceString(uint32_t& token, const RsGxsGroupId& grpId, const std::string& servString);
/*!
* sets the msg status flag
* @param token this is set to token value associated to this request
* @param grpId Id of group whose subscribe file will be changed
* @param status
* @param mask Mask to apply to status flag
*/
* sets the msg status flag
* @param token this is set to token value associated to this request
* @param grpId Id of group whose subscribe file will be changed
* @param status
* @param mask Mask to apply to status flag
*/
void setMsgStatusFlags(uint32_t& token, const RsGxsGrpMsgIdPair& msgId, const uint32_t& status, const uint32_t& mask);
/*!
* sets the message service string
* @param token this is set to token value associated to this request
* @param msgId Id of message whose service string will be changed
* @param servString The service string to set msg to
*/
* sets the message service string
* @param token this is set to token value associated to this request
* @param msgId Id of message whose service string will be changed
* @param servString The service string to set msg to
*/
void setMsgServiceString(uint32_t& token, const RsGxsGrpMsgIdPair& msgId, const std::string& servString );
protected:

View File

@ -91,6 +91,8 @@ namespace GXS_SERV {
static const uint32_t GXS_MSG_STATUS_UNREAD = 0x00000200;
static const uint32_t GXS_MSG_STATUS_READ = 0x00000400;
/** END GXS Msg status flags **/
/** START GXS Grp status flags **/

View File

@ -78,6 +78,7 @@ std::ostream &operator<<(std::ostream &out, const RsPostedVote &vote);
std::ostream &operator<<(std::ostream &out, const RsPostedComment &comment);
class RsPosted : public RsGxsIfaceImpl
{
public:
@ -106,6 +107,8 @@ virtual ~RsPosted() { return; }
virtual bool submitVote(uint32_t &token, RsPostedVote &vote) = 0;
virtual bool submitComment(uint32_t &token, RsPostedComment &comment) = 0;
virtual bool retrieveScores(const std::string& serviceString, uint32_t& upVotes, uint32_t& downVotes, uint32_t& nComments) const = 0;
// Special Ranking Request.
/*!
* Makes request for posts of a topic

View File

@ -7,10 +7,19 @@
#include "gxs/rsgxsflags.h"
#include "serialiser/rsposteditems.h"
#define NUM_TOPICS_TO_GENERATE 7
#define NUM_POSTS_TO_GENERATE 8
#define UPDATE_PHASE_GRP_REQUEST 1
#define UPDATE_PHASE_MSG_REQUEST 2
#define UPDATE_PHASE_VOTE_COMMENT_REQUEST 3
#define UPDATE_PHASE_VOTE_COUNT 4
#define UPDATE_PHASE_COMMENT_COUNT 5
#define UPDATE_PHASE_COMPLETE 6
#define NUM_TOPICS_TO_GENERATE 1
#define NUM_POSTS_TO_GENERATE 1
#define NUM_VOTES_TO_GENERATE 23
#define VOTE_UPDATE_PERIOD 20 // 20 seconds
const uint32_t RsPosted::FLAG_MSGTYPE_COMMENT = 0x0001;
const uint32_t RsPosted::FLAG_MSGTYPE_POST = 0x0002;
const uint32_t RsPosted::FLAG_MSGTYPE_VOTE = 0x0004;
@ -34,8 +43,12 @@ RsPostedVote::RsPostedVote(const RsGxsPostedVoteItem& item)
p3Posted::p3Posted(RsGeneralDataService *gds, RsNetworkExchangeService *nes)
: RsGenExchange(gds, nes, new RsGxsPostedSerialiser(), RS_SERVICE_GXSV1_TYPE_POSTED), RsPosted(this), mPostedMutex("Posted"),
mTokenService(NULL), mGeneratingTopics(true), mGeneratingPosts(false)
mTokenService(NULL), mGeneratingTopics(true), mGeneratingPosts(false), mRequestPhase1(true), mRequestPhase2(false), mRequestPhase3(false)
{
mPostUpdate = false;
mLastUpdate = time(NULL);
mUpdatePhase = UPDATE_PHASE_GRP_REQUEST;
mTokenService = RsGenExchange::getTokenService();
}
@ -46,78 +59,100 @@ void p3Posted::notifyChanges(std::vector<RsGxsNotify *> &changes)
void p3Posted::service_tick()
{
generateTopics();
//generatePosts();
generateTopics();
generatePosts();
time_t now = time(NULL);
if((now > (time_t) (VOTE_UPDATE_PERIOD + mLastUpdate)) &&
(mUpdatePhase == UPDATE_PHASE_GRP_REQUEST))
{
mPostUpdate = true;
mLastUpdate = time(NULL);
}
updateVotes();
}
void p3Posted::generatePosts()
{
if(mGeneratingPosts)
{
// request topics then chose at random which one to use to generate a post about
uint32_t token;
RsTokReqOptions opts;
opts.mReqType = GXS_REQUEST_TYPE_GROUP_IDS;
mTokenService->requestGroupInfo(token, 0, opts);
double timeDelta = 2.; // slow tick
while(mTokenService->requestStatus(token) != RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
if(mRequestPhase1)
{
#ifndef WINDOWS_SYS
usleep((int) (timeDelta * 1000000));
#else
Sleep((int) (timeDelta * 1000));
#endif
// request topics then chose at random which one to use to generate a post about
RsTokReqOptions opts;
opts.mReqType = GXS_REQUEST_TYPE_GROUP_IDS;
mTokenService->requestGroupInfo(mToken, 0, opts);
mRequestPhase1 = false;
return;
}
else if(!mRequestPhase2)
{
if(mTokenService->requestStatus(mToken) == RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
{
RsGenExchange::getGroupList(mToken, mGrpIds);
mRequestPhase2 = true;
}
}
std::list<RsGxsGroupId> grpIds;
RsGenExchange::getGroupList(token, grpIds);
// for each group generate NUM_POSTS_TO_GENERATE posts
std::list<RsGxsGroupId>::iterator lit = grpIds.begin();
for(; lit != grpIds.end(); lit++)
if(mRequestPhase2)
{
RsGxsGroupId& grpId = *lit;
// for each group generate NUM_POSTS_TO_GENERATE posts
std::list<RsGxsGroupId>::iterator lit = mGrpIds.begin();
std::vector<uint32_t> tokens;
for(int i=0; i < NUM_POSTS_TO_GENERATE; i++)
for(; lit != mGrpIds.end(); lit++)
{
std::ostringstream ostrm;
ostrm << i;
std::string link = "link" + ostrm.str();
RsGxsGroupId& grpId = *lit;
RsPostedPost post;
post.mLink = link;
post.mNotes = link;
post.mMeta.mMsgName = link;
post.mMeta.mGroupId = grpId;
for(int i=0; i < NUM_POSTS_TO_GENERATE; i++)
{
std::ostringstream ostrm;
ostrm << i;
std::string link = "link " + ostrm.str();
submitPost(token, post);
tokens.push_back(token);
RsPostedPost post;
post.mLink = link;
post.mNotes = link;
post.mMeta.mMsgName = link;
post.mMeta.mGroupId = grpId;
uint32_t token;
submitPost(token, post);
mTokens.push_back(token);
}
}
while(!tokens.empty())
{
std::vector<uint32_t>::iterator vit = tokens.begin();
mRequestPhase2 = false;
mRequestPhase3 = true;
for(; vit != tokens.end(); )
}
else if(mRequestPhase3)
{
if(!mTokens.empty())
{
std::vector<uint32_t>::iterator vit = mTokens.begin();
for(; vit != mTokens.end(); )
{
if(mTokenService->requestStatus(*vit) != RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
vit = tokens.erase(vit);
if(mTokenService->requestStatus(*vit) == RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
vit = mTokens.erase(vit);
else
vit++;
}
}else
{
// stop generating posts after acknowledging all the ones you created
mGeneratingPosts = false;
mRequestPhase3 = false;
}
}
// stop generating posts after acknowledging all the ones you created
mGeneratingPosts = false;
}
}
@ -125,40 +160,53 @@ void p3Posted::generateTopics()
{
if(mGeneratingTopics)
{
std::vector<uint32_t> tokens;
for(int i=0; i < NUM_TOPICS_TO_GENERATE; i++)
if(mRequestPhase1)
{
std::ostringstream strm;
strm << i;
std::string topicName = "Topic " + strm.str();
RsPostedGroup topic;
topic.mMeta.mGroupName = topicName;
uint32_t token;
submitGroup(token, topic);
tokens.push_back(token);
}
while(!tokens.empty())
{
std::vector<uint32_t>::iterator vit = tokens.begin();
for(; vit != tokens.end(); )
for(int i=0; i < NUM_TOPICS_TO_GENERATE; i++)
{
if(mTokenService->requestStatus(*vit) != RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
vit = tokens.erase(vit);
else
vit++;
std::ostringstream strm;
strm << i;
std::string topicName = "Topic " + strm.str();
RsPostedGroup topic;
topic.mMeta.mGroupName = topicName;
uint32_t token;
submitGroup(token, topic);
mTokens.push_back(token);
}
mRequestPhase1 = false;
}
else
{
if(!mTokens.empty())
{
std::vector<uint32_t>::iterator vit = mTokens.begin();
for(; vit != mTokens.end(); )
{
if(mTokenService->requestStatus(*vit) == RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
{
RsGxsGroupId grpId;
RsGenExchange::acknowledgeTokenGrp(*vit, grpId);
vit = mTokens.erase(vit);
}
else
vit++;
}
}
else
{
mGeneratingPosts = true;
mGeneratingTopics = false;
mRequestPhase1 = true;
}
}
mGeneratingTopics = false;
mGeneratingPosts = true;
}
}
bool p3Posted::getGroup(const uint32_t &token, std::vector<RsPostedGroup> &groups)
@ -594,7 +642,7 @@ void p3Posted::completePostedCommentRanking(GxsPostedCommentRanking *gpc)
}
}
bool p3Posted::retrieveScores(const std::string &serviceString, uint32_t &upVotes, uint32_t downVotes, uint32_t nComments) const
bool p3Posted::retrieveScores(const std::string &serviceString, uint32_t &upVotes, uint32_t& downVotes, uint32_t& nComments) const
{
if (3 == sscanf(serviceString.c_str(), "%d %d %d", &upVotes, &downVotes, &nComments))
{
@ -619,191 +667,222 @@ void p3Posted::processCommentRanks()
}
void p3Posted::updateVotes()
{
if(!mUpdateTokenQueued)
{
mUpdateTokenQueued = true;
// any request failure stops update process
if(mPostUpdate)
{
switch(mUpdatePhase)
{
// case UPDATE_PHASE_GRP_REQUEST:
// {
// updateRequestGroups(mUpda);
// break;
// }
// case UPDATE_PHASE_GRP_MSG_REQUEST:
// {
// updateRequestMessages(mVoteUpdataToken);
// break;
// }
// case UPDATE_VOTE_COMMENT_REQUEST:
// {
// updateRequestVotesComments(mVoteUpdataToken);
// break;
// }
// case UPDATE_COMPLETE_UPDATE:
// {
// updateCompleteUpdate();
// break;
// }
// default:
// break;
case UPDATE_PHASE_GRP_REQUEST:
{
mPostUpdate = updateRequestGroups();
break;
}
case UPDATE_PHASE_MSG_REQUEST:
{
mPostUpdate = updateRequestMessages();
break;
}
case UPDATE_PHASE_VOTE_COMMENT_REQUEST:
{
mPostUpdate = updateRequestVotesComments();
break;
}
case UPDATE_PHASE_VOTE_COUNT:
{
mPostUpdate = updateCompleteVotes();
break;
}
case UPDATE_PHASE_COMPLETE:
{
updateComplete();
break;
}
default:
{
std::cerr << "Unknown update phase, we should not be here!" << std::endl;
break;
}
}
// first get all msgs for groups for which you are subscribed to.
// then request comments for them
}
}
bool p3Posted::updateRequestGroups(uint32_t &token)
bool p3Posted::updateRequestGroups()
{
RsTokReqOptions opts;
opts.mReqType = GXS_REQUEST_TYPE_GROUP_IDS;
opts.mSubscribeMask = GXS_SERV::GROUP_SUBSCRIBE_MASK;
opts.mSubscribeFilter = GXS_SERV::GROUP_SUBSCRIBE_ADMIN |
GXS_SERV::GROUP_SUBSCRIBE_SUBSCRIBED;
mTokenService->requestGroupInfo(token, 0, opts);
// opts.mSubscribeMask = GXS_SERV::GROUP_SUBSCRIBE_MASK;
// opts.mSubscribeFilter = GXS_SERV::GROUP_SUBSCRIBE_ADMIN |
// GXS_SERV::GROUP_SUBSCRIBE_SUBSCRIBED;
mTokenService->requestGroupInfo(mUpdateRequestGroup, 0, opts);
mUpdatePhase = UPDATE_PHASE_GRP_MSG_REQUEST;
mUpdatePhase = UPDATE_PHASE_MSG_REQUEST;
}
bool p3Posted::updateRequestMessages(uint32_t &token)
bool p3Posted::updateRequestMessages()
{
uint32_t status = mTokenService->requestStatus(token);
uint32_t status = mTokenService->requestStatus(mUpdateRequestGroup);
if(status == RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
{
std::list<RsGxsGroupId> grpIds;
RsGenExchange::getGroupList(token, grpIds);
RsGenExchange::getGroupList(mUpdateRequestGroup, grpIds);
RsTokReqOptions opts;
opts.mReqType = GXS_REQUEST_TYPE_MSG_IDS;
opts.mReqType = GXS_REQUEST_TYPE_MSG_META;
opts.mOptions = RS_TOKREQOPT_MSG_LATEST | RS_TOKREQOPT_MSG_THREAD;
mTokenService->requestMsgInfo(token, 0, opts, grpIds);
mUpdatePhase = UPDATE_VOTE_COMMENT_REQUEST;
mTokenService->requestMsgInfo(mUpdateRequestMessages, 0, opts, grpIds);
mUpdatePhase = UPDATE_PHASE_VOTE_COMMENT_REQUEST;
return true;
}
else if(status == RsTokenService::GXS_REQUEST_V2_STATUS_FAILED)
{
mTokenService->cancelRequest(token);
mTokenService->cancelRequest(mUpdateRequestGroup);
return false;
}
return true;
}
bool p3Posted::updateRequestVotesComments(uint32_t &token)
bool p3Posted::updateRequestVotesComments()
{
uint32_t status = mTokenService->requestStatus(token);
uint32_t status = mTokenService->requestStatus(mUpdateRequestMessages);
if(status == RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
{
GxsMsgIdResult result;
RsGenExchange::getMsgList(token, result);
RsGenExchange::getMsgMeta(mUpdateRequestMessages, mMsgMetaUpdate);
std::vector<RsGxsGrpMsgIdPair> msgIds;
GxsMsgIdResult::iterator mit = result.begin();
GxsMsgMetaMap::iterator mit = mMsgMetaUpdate.begin();
for(; mit != result.end(); mit++)
for(; mit != mMsgMetaUpdate.end(); mit++)
{
std::vector<RsGxsMessageId>& msgIdV = mit->second;
std::vector<RsGxsMessageId>::const_iterator cit = msgIdV.begin();
std::vector<RsMsgMetaData>& msgIdV = mit->second;
std::vector<RsMsgMetaData>::const_iterator cit = msgIdV.begin();
for(; cit != msgIdV.end(); cit++)
msgIds.push_back(std::make_pair(mit->first, *cit));
msgIds.push_back(std::make_pair(mit->first, cit->mMsgId));
}
// only need ids for comments
RsTokReqOptions opts;
opts.mReqType = GXS_REQUEST_TYPE_MSG_IDS;
opts.mOptions = RS_TOKREQOPT_MSG_LATEST | RS_TOKREQOPT_MSG_PARENT;
opts.mMsgFlagMask = RsPosted::FLAG_MSGTYPE_MASK;
opts.mMsgFlagFilter = RsPosted::FLAG_MSGTYPE_COMMENT;
mTokenService->requestMsgRelatedInfo(mCommentToken, 0, opts, msgIds);
// // only need ids for comments
//
// opts.mReqType = GXS_REQUEST_TYPE_MSG_IDS;
// opts.mOptions = RS_TOKREQOPT_MSG_LATEST | RS_TOKREQOPT_MSG_PARENT;
// opts.mMsgFlagMask = RsPosted::FLAG_MSGTYPE_MASK;
// opts.mMsgFlagFilter = RsPosted::FLAG_MSGTYPE_COMMENT;
// mTokenService->requestMsgRelatedInfo(mCommentToken, 0, opts, msgIds);
// need actual data from votes
opts.mReqType = GXS_REQUEST_TYPE_MSG_DATA;
// need actual data for votes
opts.mReqType = GXS_REQUEST_TYPE_MSG_RELATED_DATA;
opts.mOptions = RS_TOKREQOPT_MSG_LATEST | RS_TOKREQOPT_MSG_PARENT;
opts.mMsgFlagMask = RsPosted::FLAG_MSGTYPE_MASK;
opts.mMsgFlagFilter = RsPosted::FLAG_MSGTYPE_VOTE;
mTokenService->requestMsgRelatedInfo(mVoteToken, 0, opts, msgIds);
mTokenService->requestMsgRelatedInfo(mUpdateRequestVotes, 0, opts, msgIds);
mUpdatePhase = UPDATE_COMPLETE_UPDATE;
mMsgsPendingUpdate = msgIds;
mUpdatePhase = UPDATE_PHASE_VOTE_COUNT;
return true;
}
else if(status == RsTokenService::GXS_REQUEST_V2_STATUS_FAILED)
{
mTokenService->cancelRequest(token);
mTokenService->cancelRequest(mUpdateRequestMessages);
return false;
}
return true;
}
bool p3Posted::updateCompleteUpdate()
bool p3Posted::updateCompleteVotes()
{
uint32_t commentStatus = mTokenService->requestStatus(mCommentToken);
uint32_t voteStatus = mTokenService->requestStatus(mVoteToken);
uint32_t status = mTokenService->requestStatus(mUpdateRequestVotes);
bool ready = commentStatus == RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE;
ready &= voteStatus == RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE;
bool failed = commentStatus == RsTokenService::GXS_REQUEST_V2_STATUS_FAILED;
failed &= voteStatus == RsTokenService::GXS_REQUEST_V2_STATUS_FAILED;
if(ready)
if(status == RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
{
std::map<RsGxsGrpMsgIdPair, std::vector<RsGxsMessageId> > msgCommentIds;
std::map<RsGxsGrpMsgIdPair, std::vector<RsPostedVote> > votes;
getMsgRelatedDataT<RsGxsPostedVoteItem, RsPostedVote>(mVoteToken, votes);
std::vector<RsGxsGrpMsgIdPair>::iterator vit = mMsgsPendingUpdate.begin();
getMsgRelatedDataT<RsGxsPostedVoteItem, RsPostedVote>(mUpdateRequestVotes,
votes);
for(; vit != mMsgsPendingUpdate.end();vit++)
// now for each msg count the number of votes and thats it
std::map<RsGxsGrpMsgIdPair, std::vector<RsPostedVote> >::iterator mit = votes.begin();
for(; mit != votes.end(); mit++)
{
updateMsg(*vit, votes[*vit], msgCommentIds[*vit]);
const std::vector<RsPostedVote>& v = mit->second;
std::vector<RsPostedVote>::const_iterator cit = v.begin();
for(; cit != v.end(); cit++)
{
const RsPostedVote& vote = *cit;
if(vote.mDirection)
{
mMsgCounts[mit->first].upVotes++;
}else
{
mMsgCounts[mit->first].downVotes++;
}
}
}
mUpdatePhase = 0;
mUpdatePhase = UPDATE_PHASE_COMPLETE;
}
else if(failed)
else if(status == RsTokenService::GXS_REQUEST_V2_STATUS_FAILED)
{
mTokenService->cancelRequest(mCommentToken);
mTokenService->cancelRequest(mVoteToken);
mTokenService->cancelRequest(mUpdateRequestVotes);
return false;
}else
{
return true;
}
return true;
}
bool p3Posted::updateMsg(const RsGxsGrpMsgIdPair& msgId, const std::vector<RsPostedVote> &msgVotes,
const std::vector<RsGxsMessageId>& msgCommentIds)
bool p3Posted::updateComplete()
{
// now compare with msg meta to see what currently store there
uint32_t nComments = msgCommentIds.size();
uint32_t nUp = 0, nDown = 0;
GxsMsgMetaMap::iterator mit = mMsgMetaUpdate.begin();
std::vector<RsPostedVote>::const_iterator cit = msgVotes.begin();
for(; cit != msgVotes.end(); cit++)
for(; mit != mMsgMetaUpdate.end(); mit++)
{
const RsPostedVote& v = *cit;
const std::vector<RsMsgMetaData>& msgMetaV = mit->second;
std::vector<RsMsgMetaData>::const_iterator cit = msgMetaV.begin();
if(v.mDirection == 0)
for(; cit != msgMetaV.end(); cit++)
{
nDown++;
}else
{
nUp++;
const RsMsgMetaData& msgMeta = *cit;
uint32_t upVotes, downVotes, nComments;
retrieveScores(msgMeta.mServiceString, upVotes, downVotes, nComments);
RsGxsGrpMsgIdPair msgId;
msgId.first = mit->first;
msgId.second = msgMeta.mMsgId;
PostedScore& sc = mMsgCounts[msgId];
bool changed = (sc.upVotes != upVotes) || (sc.downVotes != downVotes);
if(changed)
{
std::string servStr;
storeScores(servStr, sc.upVotes, sc.downVotes, 0);
uint32_t token;
setMsgServiceString(token, msgId, servStr);
mChangeTokens.push_back(token);
}
else
{
mMsgCounts.erase(msgId);
}
}
}
std::string servStr;
storeScores(servStr, nUp, nDown, nComments);
uint32_t token;
setMsgServiceString(token, msgId, servStr);
}
mPostUpdate = false;
mUpdatePhase = UPDATE_PHASE_GRP_REQUEST;
}

View File

@ -31,16 +31,15 @@ public:
class PostedScore {
public:
int32_t upVotes, downVotes;
PostedScore() : upVotes(0), downVotes(0), commentCount(0), date(0) {}
uint32_t upVotes, downVotes;
uint32_t commentCount;
time_t date;
RsGxsMessageId msgId;
};
#define UPDATE_PHASE_GRP_REQUEST 1
#define UPDATE_PHASE_GRP_MSG_REQUEST 2
#define UPDATE_VOTE_COMMENT_REQUEST 3
#define UPDATE_COMPLETE_UPDATE 4
class p3Posted : public RsGenExchange, public RsPosted
{
@ -93,6 +92,8 @@ public:
bool requestMessageRankings(uint32_t &token, const RankType &rType, const RsGxsGroupId &groupId);
bool requestCommentRankings(uint32_t &token, const RankType &rType, const RsGxsGrpMsgIdPair &msgId);
bool retrieveScores(const std::string& serviceString, uint32_t& upVotes, uint32_t& downVotes, uint32_t& nComments) const;
private:
/* Functions for processing rankings */
@ -103,7 +104,7 @@ private:
void discardCalc(const uint32_t& token);
void completePostedPostCalc(GxsPostedPostRanking* gpp);
void completePostedCommentRanking(GxsPostedCommentRanking* gpc);
bool retrieveScores(const std::string& serviceString, uint32_t& upVotes, uint32_t downVotes, uint32_t nComments) const;
bool storeScores(std::string& serviceString, uint32_t& upVotes, uint32_t downVotes, uint32_t nComments) const;
// for posts
@ -124,12 +125,19 @@ private:
* Also stores updates for messages which have new scores
*/
void updateVotes();
bool updateRequestGroups(uint32_t& token);
bool updateRequestMessages(uint32_t& token);
bool updateRequestVotesComments(uint32_t& token);
bool updateCompleteUpdate();
bool updateMsg(const RsGxsGrpMsgIdPair& msgId, const std::vector<RsPostedVote>& msgVotes,
const std::vector<RsGxsMessageId>& msgCommentIds);
bool updateRequestGroups();
bool updateRequestMessages();
bool updateRequestVotesComments();
bool updateCompleteVotes();
bool updateCompleteComments();
/*!
* The aim of this is create notifications
* for the UI of changes to a post if their vote
* or comment count has changed
*/
bool updateComplete();
private:
@ -140,10 +148,14 @@ private:
std::map<uint32_t, GxsPostedCommentRanking*> mPendingCalculationCommentRanks;
// for maintaining vote counts in msg meta
uint32_t mVoteUpdataToken, mVoteToken, mCommentToken;
bool mUpdateTokenQueued;
uint32_t mUpdateRequestGroup, mUpdateRequestMessages, mUpdateRequestComments, mUpdateRequestVotes;
bool mPostUpdate;
uint32_t mUpdatePhase;
std::vector<RsGxsGrpMsgIdPair> mMsgsPendingUpdate;
time_t mLastUpdate;
GxsMsgMetaMap mMsgMetaUpdate;
std::map<RsGxsGrpMsgIdPair, PostedScore > mMsgCounts;
std::vector<uint32_t> mChangeTokens;
RsTokenService* mTokenService;
RsMutex mPostedMutex;
@ -151,7 +163,11 @@ private:
// for data generation
bool mGeneratingPosts, mGeneratingTopics;
bool mGeneratingPosts, mGeneratingTopics, mRequestPhase1, mRequestPhase2, mRequestPhase3;
std::vector<uint32_t> mTokens;
uint32_t mToken;
std::list<RsGxsGroupId> mGrpIds;
};
#endif // P3POSTED_H

View File

@ -55,7 +55,12 @@ PostedItem::PostedItem(PostedHolder *postHolder, const RsPostedPost &post)
"><span style=\" text-decoration: underline; color:#0000ff;\">" +
QString::fromStdString(post.mLink) + "</span></a>");
scoreLabel->setText(QString("1"));
uint32_t up, down, nComments;
rsPosted->retrieveScores(mPost.mMeta.mServiceString, up, down, nComments);
int32_t vote = up - down;
scoreLabel->setText(QString::number(vote));
connect( commentButton, SIGNAL( clicked() ), this, SLOT( loadComments() ) );
connect( voteUpButton, SIGNAL(clicked()), this, SLOT(makeUpVote()));
@ -72,16 +77,16 @@ RsPostedPost PostedItem::getPost() const
void PostedItem::makeDownVote()
{
RsGxsGrpMsgIdPair msgId;
msgId.first = mPost.mMeta.mMsgId;
msgId.second = mPost.mMeta.mGroupId;
msgId.first = mPost.mMeta.mGroupId;
msgId.second = mPost.mMeta.mMsgId;
emit vote(msgId, false);
}
void PostedItem::makeUpVote()
{
RsGxsGrpMsgIdPair msgId;
msgId.first = mPost.mMeta.mMsgId;
msgId.second = mPost.mMeta.mGroupId;
msgId.first = mPost.mMeta.mGroupId;
msgId.second = mPost.mMeta.mMsgId;
emit vote(msgId, true);
}

View File

@ -53,7 +53,7 @@ border-radius: 10px}</string>
</font>
</property>
<property name="text">
<string>1</string>
<string>0</string>
</property>
</widget>
</item>