diff --git a/libretroshare/src/retroshare/rsreputations.h b/libretroshare/src/retroshare/rsreputations.h index 7b227e70f..ee09458a8 100644 --- a/libretroshare/src/retroshare/rsreputations.h +++ b/libretroshare/src/retroshare/rsreputations.h @@ -40,6 +40,7 @@ public: { RsReputations::Opinion mOwnOpinion ; float mOverallReputationScore ; + float mFriendAverage ; RsReputations::Assessment mAssessment; // this should help clients in taking decisions }; diff --git a/libretroshare/src/services/p3gxsreputation.cc b/libretroshare/src/services/p3gxsreputation.cc index d7e815cae..7de4165d2 100644 --- a/libretroshare/src/services/p3gxsreputation.cc +++ b/libretroshare/src/services/p3gxsreputation.cc @@ -524,6 +524,7 @@ bool p3GxsReputation::getReputationInfo(const RsGxsId& gxsid, RsReputations::Rep if (it == mReputations.end()) { info.mOwnOpinion = RsReputations::OPINION_NEUTRAL ; + info.mFriendAverage = RsReputations::OPINION_NEUTRAL ; info.mOverallReputationScore = float(RsReputations::OPINION_NEUTRAL) ; info.mAssessment = RsReputations::ASSESSMENT_OK ; #ifdef DEBUG_REPUTATION @@ -533,7 +534,8 @@ bool p3GxsReputation::getReputationInfo(const RsGxsId& gxsid, RsReputations::Rep else { info.mOwnOpinion = RsReputations::Opinion(it->second.mOwnOpinion) ; - info.mOverallReputationScore = float(it->second.mReputation) ; + info.mOverallReputationScore = it->second.mReputation ; + info.mFriendAverage = it->second.mFriendAverage ; if(info.mOverallReputationScore > REPUTATION_ASSESSMENT_THRESHOLD_X1) info.mAssessment = RsReputations::ASSESSMENT_OK ; @@ -874,9 +876,15 @@ float Reputation::updateReputation(uint32_t average_active_friends) friend_total += it->second - 1; if(mOpinions.empty()) // includes the case of no friends! + { mReputation = 1.0f; + mFriendAverage = 1.0f ; + } else - mReputation = 1.0f + friend_total / float(std::max(average_active_friends,(uint32_t)mOpinions.size())) ; + { + mFriendAverage = 1.0+friend_total / float(std::max(average_active_friends,(uint32_t)mOpinions.size())); + mReputation = mFriendAverage ; + } } else mReputation = (float)mOwnOpinion ; @@ -893,7 +901,7 @@ void p3GxsReputation::debug_print() for(std::map::const_iterator it(mReputations.begin());it!=mReputations.end();++it) { - std::cerr << " ID=" << it->first << ", own: " << it->second.mOwnOpinion << ", global_score: " << it->second.mReputation + std::cerr << " ID=" << it->first << ", own: " << it->second.mOwnOpinion << ", Friend average: " << it->second.mFriendAverage << ", global_score: " << it->second.mReputation << ", last own update: " << now - it->second.mOwnOpinionTs << " secs ago." << std::endl; for(std::map::const_iterator it2(it->second.mOpinions.begin());it2!=it->second.mOpinions.end();++it2) diff --git a/libretroshare/src/services/p3gxsreputation.h b/libretroshare/src/services/p3gxsreputation.h index d69c8da89..82f954b4d 100644 --- a/libretroshare/src/services/p3gxsreputation.h +++ b/libretroshare/src/services/p3gxsreputation.h @@ -70,6 +70,7 @@ public: int32_t mOwnOpinion; time_t mOwnOpinionTs; + float mFriendAverage ; float mReputation; }; diff --git a/retroshare-gui/src/gui/Identity/IdDialog.cpp b/retroshare-gui/src/gui/Identity/IdDialog.cpp index afdd3ceec..2d26c55b4 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdDialog.cpp @@ -680,8 +680,11 @@ void IdDialog::insertIdDetails(uint32_t token) RsReputations::ReputationInfo info ; rsReputations->getReputationInfo(RsGxsId(data.mMeta.mGroupId),info) ; - ui->overallOpinion_TF->setText(QString::number(info.mOverallReputationScore)); + ui->neighborNodesOpinion_TF->setText(QString::number(info.mOverallReputationScore-1.0f)); + ui->overallOpinion_TF->setText(QString::number(info.mOverallReputationScore-1.0f) +" ("+ + ((info.mAssessment == RsReputations::ASSESSMENT_OK)? tr("OK") : tr("Banned")) +")" ) ; + switch(info.mOwnOpinion) { case RsReputations::OPINION_NEGATIVE: ui->ownOpinion_CB->setCurrentIndex(0); break ; @@ -690,8 +693,6 @@ void IdDialog::insertIdDetails(uint32_t token) default: std::cerr << "Unexpected value in own opinion: " << info.mOwnOpinion << std::endl; } - - //ui->neighborNodesOpinion_TF->setText(QString::number(info.m)); } void IdDialog::modifyReputation() @@ -740,11 +741,9 @@ void IdDialog::modifyReputation() std::cerr << std::endl; #endif -#ifdef SUSPENDED // trigger refresh when finished. // basic / anstype are not needed. - mIdQueue->queueRequest(token, 0, 0, IDDIALOG_REFRESH); -#endif + requestIdDetails(); return; } diff --git a/retroshare-gui/src/gui/Identity/IdDialog.ui b/retroshare-gui/src/gui/Identity/IdDialog.ui index 06462cca3..b6649e413 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.ui +++ b/retroshare-gui/src/gui/Identity/IdDialog.ui @@ -485,6 +485,9 @@ + + <html><head/><body><p>Average opinion of neighbor nodes about this identity. Negative is bad,</p><p>positive is good. Zero is neutral.</p></body></html> + true @@ -530,12 +533,16 @@ p, li { white-space: pre-wrap; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - 1 + 0 Negative + + + ../icons/yellow_biohazard64.png../icons/yellow_biohazard64.png + @@ -551,6 +558,9 @@ p, li { white-space: pre-wrap; } + + <html><head/><body><p>Overall reputation score, accounting for yours and your friends'.</p><p>Negative is bad, positive is good. Zero is neutral. If the score is too low,</p><p>the identity is flagged as bad, and will be filtered out in forums, chat lobbies,</p><p>channels, etc.</p></body></html> + true diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp index e51527860..0f2f656d3 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp @@ -41,6 +41,7 @@ #include "util/QtVersion.h" #include +#include #include // These should be in retroshare/ folder. #include "retroshare/rsgxsflags.h" @@ -57,6 +58,7 @@ #define IMAGE_DOWNLOAD ":/images/start.png" #define IMAGE_DOWNLOADALL ":/images/startall.png" #define IMAGE_COPYLINK ":/images/copyrslink.png" +#define IMAGE_BIOHAZARD ":/icons/yellow_biohazard64.png" #define VIEW_LAST_POST 0 #define VIEW_THREADED 1 @@ -406,6 +408,9 @@ void GxsForumThreadWidget::threadListCustomPopupMenu(QPoint /*point*/) QAction *replyauthorAct = new QAction(QIcon(IMAGE_MESSAGEREPLY), tr("Reply with private message"), &contextMnu); connect(replyauthorAct, SIGNAL(triggered()), this, SLOT(replytomessage())); + QAction *flagasbadAct = new QAction(QIcon(IMAGE_BIOHAZARD), tr("Flag this person as bad"), &contextMnu); + connect(flagasbadAct, SIGNAL(triggered()), this, SLOT(flagpersonasbad())); + QAction *newthreadAct = new QAction(QIcon(IMAGE_MESSAGE), tr("Start New Thread"), &contextMnu); newthreadAct->setEnabled (IS_GROUP_SUBSCRIBED(mSubscribeFlags)); connect(newthreadAct , SIGNAL(triggered()), this, SLOT(createthread())); @@ -484,6 +489,8 @@ void GxsForumThreadWidget::threadListCustomPopupMenu(QPoint /*point*/) contextMnu.addAction(expandAll); contextMnu.addAction(collapseAll); + contextMnu.addSeparator(); + contextMnu.addAction(flagasbadAct); contextMnu.addSeparator(); contextMnu.addAction(replyauthorAct); @@ -1685,6 +1692,17 @@ static QString buildReplyHeader(const RsMsgMetaData &meta) return header; } +void GxsForumThreadWidget::flagpersonasbad() +{ + if (groupId().isNull() || mThreadId.isNull()) { + QMessageBox::information(this, tr("RetroShare"),tr("You cant reply to a non-existant Message")); + return; + } + + // Get Message ... then complete replyMessageData(). + rsReputations->setOwnOpinion(RsGxsId(groupId()),RsReputations::OPINION_NEGATIVE) ; +} + void GxsForumThreadWidget::replytomessage() { if (groupId().isNull() || mThreadId.isNull()) { diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h index 311024f07..293a8fb7b 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.h @@ -101,6 +101,7 @@ private slots: void downloadAllFiles(); void changedViewBox(); + void flagpersonasbad(); void filterColumnChanged(int column); void filterItems(const QString &text); @@ -170,7 +171,7 @@ private: RsGxsMessageId mNavigatePendingMsgId; QList mIgnoredMsgId; - Ui::GxsForumThreadWidget *ui; + Ui::GxsForumThreadWidget *ui; }; #endif // GXSFORUMTHREADWIDGET_H diff --git a/retroshare-gui/src/gui/icons.qrc b/retroshare-gui/src/gui/icons.qrc index 8840c6087..3cee5d1d2 100644 --- a/retroshare-gui/src/gui/icons.qrc +++ b/retroshare-gui/src/gui/icons.qrc @@ -60,5 +60,6 @@ icons/user-busy_64.png icons/user-offline_64.png icons/user-online_64.png + icons/yellow_biohazard64.png diff --git a/retroshare-gui/src/gui/icons/yellow_biohazard64.png b/retroshare-gui/src/gui/icons/yellow_biohazard64.png new file mode 100644 index 000000000..edb6fb3f2 Binary files /dev/null and b/retroshare-gui/src/gui/icons/yellow_biohazard64.png differ