From: <de...@de...> - 2011-02-24 11:49:15
|
Author: JoonaKannisto Date: 2011-02-24 05:49:02 -0600 (Thu, 24 Feb 2011) New Revision: 20506 Trac url: http://develop.twiki.org/trac/changeset/20506 Added: twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginChangeValues.txt twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginInfo.txt twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginInfofi.txt twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginToplist.txt twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginVoted.txt twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginVotedfi.txt twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/Config.spec twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/I18N.pm twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/I18N/ twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/I18N/en.pm twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/I18N/fi.pm twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/I18N/i_default.pm twiki/trunk/ReputationPlugin/pub/ twiki/trunk/ReputationPlugin/pub/TWiki/ twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/ twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/UI.png twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/bar/ twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/bar/excellent.gif twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/bar/good.gif twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/bar/graph2.css twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/bar/negative.gif twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/bar/poor.gif twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/bar/positive.gif twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/js/ twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/js/hide.js twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/js/slider.js twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/slider/ twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/slider/slider-1.png twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/slider/slider-disabled-1.png twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/slider/slider-disabled.png twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/slider/slider.css twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/slider/slider.png twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/smiley/ twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/smiley/bg_button_a.gif twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/smiley/bg_button_span.gif twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/smiley/buttons.css twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/smiley/excellent.gif twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/smiley/negative.gif twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/smiley/poor.gif twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/smiley/positive.gif twiki/trunk/ReputationPlugin/pub/TWiki/ReputationPlugin/valuesliders.png twiki/trunk/ReputationPlugin/templates/view.reputation4.tmpl Removed: twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginChangeValue.txt Modified: twiki/trunk/ReputationPlugin/data/TWiki/ReputationPlugin.txt twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin.pm twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/MANIFEST twiki/trunk/ReputationPlugin/templates/view.reputation.tmpl Log: Item6638: Large commit, most functions re-written Modified: twiki/trunk/ReputationPlugin/data/TWiki/ReputationPlugin.txt =================================================================== --- twiki/trunk/ReputationPlugin/data/TWiki/ReputationPlugin.txt 2011-02-24 09:04:28 UTC (rev 20505) +++ twiki/trunk/ReputationPlugin/data/TWiki/ReputationPlugin.txt 2011-02-24 11:49:02 UTC (rev 20506) @@ -1,33 +1,40 @@ -%META:TOPICINFO{author="TWikiContributor" date="1280204852" format="1.1" version="$Rev$"}% +%META:TOPICINFO{author="KalleLaitela" date="1298027521" format="1.1" reprev="1.6" version="1.6"}% ---+!! <nop>%TOPIC% + <!-- Contributions to this plugin are appreciated. Please update the plugin page at http://twiki.org/cgi-bin/view/Plugins/ReputationPlugin or provide feedback at http://twiki.org/cgi-bin/view/Plugins/ReputationPluginDev. If you are a TWiki contributor please update the plugin in the SVN repository. ---> -<sticky> -<div style="float:right; background-color:#EBEEF0; margin:0 0 20px 20px; padding: 0 10px 0 10px;"> -%TOC{title="Page contents"}% -</div> -</sticky> +--> %SHORTDESCRIPTION% ----++ Introduction +%TOC{title="Page contents"}% -Plugin for creating and maintaining user reputation in a TWiki site. Reputation is managed by voting topics which makes topic's authors either more or less trusted, depending on the vote. Plugin calculates a score for every article based on users own past experiences with topic's voters and with past experience of users who are trustworthy from user's perspective. It also counts the number of backlinks which lead to this topic, this is used as a metric for topic's popularity. +---++ Introduction and Features -Plugin is provided mainly as a prototype and basis for future development. It works, but needs more work to achieve its full potential. Much of the code is taken from TWiki:Plugins.TagMePlugin because I didn't want to start from scratch, as this was my first TWiki Plugin and the first thing I've written in Perl. +This is a plugin for creating and maintaining user and content reputation in a TWiki site. Reputation is managed by voting topics which makes topic's authors either more or less trusted, depending on the vote. Topics receive score from the votes and this score can be used to evaluate topics trustworthiness. +Because the users in a wiki can be more or less interconnected, the plugin can be used in two different modes. In relative mode it calculates a score for every article based on users own past experiences with topic's voters and with past experience of users who are trustworthy from user's perspective. In absolute vote count mode, the votes are simply added together. The behaviour can be controlled either by the user or the site administration. + +In addition to voting the plugin can count the number of backlinks which lead to a topic, this can be used as a metric for topic's popularity. It is somewhat questionable if the amount of interlinking can be used to measure trustworthiness, since interlinking is inherent to wikis and it doesn't necessarily imply that the author of the linking article has even read the topic in question. Amount of backlinks is still a useful value, because it measures the need for a particular topic and doesn't create any additional work for the users. However, this feature can have a performance penalty so it's turned off by default. + +In addition to the core functionality, features include: + * Toplists for webs + * Listing of voted topics for every user + * Optional voting quotas for webs +Much of the code was originally taken from TWiki:Plugins.TagMePlugin because I didn't want to start from scratch, as this was my first TWiki Plugin and the first thing I've written in Perl. In the current version mostly plugin's internal data storage functions have code originating from TWiki:Plugins.TagMePlugin. + ---++ Syntax +The plugin uses basic TWiki syntax, allthough it is primarily intended to be used interactively by the end users. Additional functionality is meant to be used through provided template topics. ---+++ Commands for topic voting | =%<nop>REPUTATION{ rpaction="vote" vote="negative" }%= | Prints voting buttons and adds negative vote for this topic. | | =%<nop>REPUTATION{ rpaction="remove" vote="positive" }%= | Prints voting buttons and tries to remove positive vote for this topic. | | =%<nop>REPUTATION{ rpaction="%<nop>URLPARAM{rpaction}%" vote="%<nop>URLPARAM{vote}%" }%= | Prints voting buttons and reads the user input from current page view URL. | -Wanted action is given to the plugin with =rpaction= parameter. Additional parameters are needed for: +Wanted action is given to the plugin with =rpaction= parameter. Additional parameters are needed for: * =vote= - Adds vote given with =vote= parameter for the currently viewed topic * =remove= - Removes vote given with =vote= parameter from currently viewed topic's votes @@ -36,116 +43,123 @@ | =%<nop>REPUTATION{ rpaction="showtopics" }%= | Lists all the topics which current user has voted. List includes authors as they were on the time of the vote. | | =%<nop>REPUTATION{ rpaction="showtrusted" }%= | List of users who have been authors of voted topics and their respective scores. | - +| =%<nop>REPUTATION{ rpaction="showtoplist" web="Sandbox"}%= | List all the voted topics in given web (the web name is optional) | ---+++ Trust value manipulation -| =%<nop>REPUTATION{ rpaction="addtrust" addvalue="30" user="TWikiGuest" }%= | Adds given value to selected user's trust score. | -| =%<nop>REPUTATION{ rpaction="addtrust" addvalue="%<nop>URLPARAM{addvalue}%" user="%<nop>URLPARAM{wikiname}%" }%= | Can be used with a form to collect the user and a =addvalue= from URL parameters | +When some user is known 'out of band' (eg. from real life) user might want to trust him more or less than the level of trust derived from their interaction on the wiki. Distribution includes a template topic for this %SYSTEMWEB%.ReputationPluginChangeValues +| =%<nop>REPUTATION{ rpaction="addtrust" addvalue="30" user="TWikiGuest" }%= | Adds given value to user's trust score. | +| %REPUTATION{rpaction="addtrust" addvalue="%%NOP%URLPARAM{addvalue}%" user="%%NOP%URLPARAM{user}%" oldvalue="%%NOP%URLPARAM{oldvalue}%" slider="%%NOP%URLPARAM{slider}%"}% | The included %SYSTEMWEB%.ReputationPluginChangeValues topic has this command, the plugin prints the sliders and this command collects the URL-parameters from the form. | ---++ Example commands *Example 1:* =%<nop>REPUTATION{ rpaction="%<nop>URLPARAM{rpaction}%" vote="%<nop>URLPARAM{vote}%" }%= -*Output:* +*Output with theme 'plain', four options and backlink search enabled* -Popularity: 7/20 Rating 0.00<form name="newnegative" action="ReputationPlugin"> <input type="hidden" name="rpaction" value="vote"/><input type="hidden" name="vote" value="negative"/> <input type="submit" class="twikiSubmit" value="Vote negative (0)" /></form><form name="newpositive" action="ReputationPlugin"><input type="hidden" name="rpaction" value="vote"/><input type="hidden" name="vote" value="positive"/> <input type="submit" class="twikiSubmit" value="Vote positive (0)" /></form><form name="newexcellent" action="ReputationPlugin"> <input type="hidden" name="rpaction" value="vote"/><input type="hidden" name="vote" value="excellent"/> <input type="submit" class="twikiSubmit" value="Vote excellent (0)" /></form> +Popularity: 7/20 Rating 0.00<form name="newpoor" action="ReputationPlugin"> <input type="hidden" name="rpaction" value="vote"/><input type="hidden" name="vote" value="poor"/> <input type="submit" class="twikiSubmit" value="poor (0)" /><form name="newnegative" action="ReputationPlugin"> <input type="hidden" name="rpaction" value="vote"/><input type="hidden" name="vote" value="negative"/> <input type="submit" class="twikiSubmit" value="negative (0)" /></form><form name="newpositive" action="ReputationPlugin"><input type="hidden" name="rpaction" value="vote"/><input type="hidden" name="vote" value="positive"/> <input type="submit" class="twikiSubmit" value="positive (0)" /></form><form name="newexcellent" action="ReputationPlugin"> <input type="hidden" name="rpaction" value="vote"/><input type="hidden" name="vote" value="excellent"/> <input type="submit" class="twikiSubmit" value="excellent (0)" /></form> ------ +*Output with default theme 'smiley', with default settings* + +<img width="499" alt="UI.png" src="/twiki/core/pub/TWiki/ReputationPlugin/UI.png" height="34" /> +--- + *Example 2:* =%<nop>REPUTATION{ rpaction="showtopics" }%= *Output:* +---++ Topics voted as positive -positive, !ReputationPlugin, !TestUser1 +Topic: TestiSivu2 Authors: JoonaKannisto SeppoTaalasmaa<br /> Topic: WebChanges Authors: WikiGuest<br /> Topic: TestTopic2 Authors: JoonaKannisto +---++ Topics voted as negative -positive, !WebPreferences, !TestUser1, !TestUser2, !TWikiContributor, !TestUser3, !TestUser5, !TestUser4 +Topic: JoonaKannisto Authors: JoonaKannisto TWikiRegistrationAgent?<br /> Topic: TestiSivu Authors: JoonaKannisto SeppoTaalasmaa AdminUser<br /> Topic: WebHome Authors: WikiGuest<br /> Topic: WebPreferences Authors: JoonaKannisto TWikiContributor? ArthurClemens? PeterThoeny? JohnTalintyre?<br /> Topic: TestTopic1 Authors: SeppoTaalasmaa UllaTaalasmaa<br /> Topic: ReputationPlugin Authors: JoonaKannisto -positive, !TestTopic3, !TestUser1 +--- -positive, !TestUser1 - -positive, !SivuTiedot, !TestUser2 - -negative, !TestiArtikkeli1, !TestUser2 - -negative, !TestTopic2, !TestUser1, !TestUser1 - -negative, !TestUser1, !TestUser1, !TWikiRegistrationAgent - -excellent, !TestiArtikkeli2, !TestUser2, !OpettajaOlio - -excellent, !TestUser6, !TestUser3, !TeppoTesti - -excellent, !TestTopic0, !TWikiGuest, !TestUser1, !TestUser3 - ------ *Example 3:* =%<nop>REPUTATION{ rpaction="showtrusted" }%= -*Output:* +<img width="774" alt="valuesliders.png" src="http://oskari/twiki/core/pub/TWiki/ReputationPlugin/valuesliders.png" height="152" /> -999, !TWikiContributor - -999, !TestUser3 - -999, !TestUser2 - -999, !TestUser5 - -503, !TestUser4 - -502, !TestUser6 - -502, !TeppoTest - -502, !TWikiGuest - -502, !OpettajaOlio - -499, !TWikiRegistrationAgent - ---++ Plugin Settings - * One line description, is shown in the %SYSTEMWEB%.TextFormattingRules topic: +Most of the plugin settings are preferences settings. Cfg variables were not used as much as they should, since the main target for this plugin runs TWiki through mod_perl and TWiki with mod_perl doesn't read LocalSite.cfg until the server process is restarted. + * One line description, is shown in the %SYSTEMWEB%.TextFormattingRules topic: * Set SHORTDESCRIPTION = Create and maintain user reputation in a TWiki site + * Optional Plugin settings, can be added to TWiki configure, =twiki/lib/LocalSite.cfg=: + * =$TWiki::cfg{Plugins}{ReputationPlugin}{Voterreputation} =0;= --- If set to 1 other voters also gain or lose reputation depending on their agreement with the user. + * =$TWiki::cfg{Plugins}{ReputationPlugin}{Debug} =0;= --- Turn on debug mode (no intended for normal use) +---+++ Plugin access control settings +These are standard [[http://twiki.org/cgi-bin/view/TWiki/TWikiAccessControl][TWiki Access Control] rules. In addition to allow rules, it is possible to use deny lists as well. These variables accept comma separated lists of groups or usernames as value. + * This setting controls the visibility of the votes + * Set ALLOWTOPICRPREAD = + * Votes can be restricted + * Set ALLOWTOPICRPVOTE = +---+++ Plugin settings which only have effect in WebPreferences + * This controls the number of voting options shown to user (currently has options 2 and 4) + * Set REPUTATIONPLUGIN_VOTEOPTIONS = 2 + * With restricted votes it can be a good idea to hide the toplist for the web as well + * Set REPUTATIONPLUGIN_TOPLISTHIDDEN=0 + * Different groups can have different weights on different webs + * Set REPUTATIONPLUGIN_WEIGHTGROUPS = AdminGroup,2,TestGroup,3 + * Possibility to restrict the number of votes user has by assining a quota for every option + * Set REPUTATIONPLUGIN_WEBQUOTA = 1 + * Define the quota for each option (default shown here), this can be used to make limited votings in a web. + * #Set REPUTATIONPLUGIN_QUOTATMPL = excellent,2,positive,2,negative,2,poor,2 +---+++ User spesific settings - * Optional Plugin settings, can be added to TWiki configure, =twiki/lib/LocalSite.cfg=: - * =$TWiki::cfg{Plugins}{ReputationPlugin}{Backlinkmax} = 5;= --- changes the maximum back-link count to five. Setting this number to zero disables back-link functionality altogether. - * =$TWiki::cfg{Plugins}{ReputationPlugin}{Absolute} = 1;= --- set if raw scores are needed instead of the scores derived from trust values. +These settings can be used in all preference topics. Allthough changing them in the user topic makes most sense. + * Maximum number of backlinks searched, zero disables the functionality + * Set REPUTATIONPLUGIN_BACKLINKMAX = 0 + * Theme chooser, options are plain and smiley (default shown here). Plain theme is implemented with standard HTML-submit buttons and in smiley they are styled. + * Voting interface is not shown in system topics by default, setting this value to 1 changes the behaviour. + * Set REPUTATIONPLUGIN_INCLUDESYSTEMTOPICS = 0 + * Changes the behaviour to take account the reputation of voters, all the following options are dependent on this option + * Set REPUTATIONPLUGIN_RATINGTYPE = relative + * Users with a trust value below 500 are considered as noise by default. This option controls whether we ignore these untrusted users or count their votes with negative value. + * Set REPUTATIONPLUGIN_TRUSTTHRESHOLD = 500 + * This changes the way we handle recommendations, all the recommendations from users with trustvalue below this are not taken into account. The default value is 1000 and the maximum value for trust in the plugin is 999, which means that recommendations are not used unless this parameter is defined. If this value is set below 500, which is the default value for user trust, the recommendations are calculated with negative value. + * Set REPUTATIONPLUGIN_RECOMMENDATIONTHRESHOLD = 1000 + * This option controls the weight given to trusted users + * Set REPUTATIONPLUGIN_TRUSTEDWEIGHT = 5 + * This option controls the weight of the unknown users (the trusted users are actually counted twice) + * Set REPUTATIONPLUGIN_UNKNOWNWEIGHT = 1 +---++ Included template topics +[[%SYSTEMWEB%.ReputationPluginChangeValues]] provides an easy to use interface for making manual adjustments to trust relations. [[%SYSTEMWEB%.ReputationPluginToplist]] see all the ratings in a single web at once. ---++ Plugin Installation Instructions __Note:__ You do not need to install anything on the browser to use this plugin. The following instructions are for the administrator who installs the plugin on the TWiki server. * Download the ZIP file from the Plugin Home (see below) - * Unzip ==%TOPIC%.zip== in your twiki installation directory. Content: - | *File:* | *Description:* | - | ==data/TWiki/%TOPIC%.txt== | Plugin topic | - | ==data/TWiki/%TOPIC%.txt,v== | Plugin topic repository | - | ==data/TWiki/ReputationPluginChangeValue.txt== | Topic for altering trust values| - | ==templates/view.reputation.tmpl==| View template for including plugin as a skin| - | ==lib/TWiki/Plugins/%TOPIC%.pm== | Plugin Perl module | - * Configure the Plugin: + * Unzip ==%TOPIC%.zip== in your twiki installation directory. + * Configure the Plugin: * Run the [[%SCRIPTURL{configure}%][configure]] script to enable the Plugin * Change the Plugin settings as needed * Test if the installation was successful: <verbatim>%REPUTATION{rpaction="%URLPARAM{rpaction}%" vote="%URLPARAM{vote}%"}%</verbatim> -%REPUTATION{rpaction="%URLPARAM{rpaction}%" vote="%URLPARAM{vote}%"}% +%REPUTATION{rpaction="%URLPARAM{rpaction}%" vote="%URLPARAM{vote}%"}% ---+++ Make the plugin appear on every page -Inside the zip file is a skin template that makes this plugin to show up just before the topic's text content. Skin can be enabled for a web (For all webs [[%USERSWEB%.TWikiPreferences]] for a single web, for example Sandbox web Sandbox.WebPreferences ) or for a single topic in Topic's preferences <pre> * Set S<nop>KIN = reputation,pattern </pre> Skin can be excluded from any topic or web by setting its skin without Reputation%NOP%Plugin's skin eg: +Inside the zip file is a skin template that makes this plugin to show up just before the topic's text content. Skin can be enabled for a web (For all webs [[%LOCALSITEPREFS%]] for a single web, for example Sandbox web Sandbox.WebPreferences ) or for a single topic in Topic's preferences +<pre> * Set S<nop>KIN = reputation,pattern </pre> +Skin can be excluded from any topic or web by setting its skin without Reputation%NOP%Plugin's skin eg: + <pre> * Set S<nop>KIN = pattern </pre> +%X% Note about the template system: This skin defines the content part of the TWiki page, if you have some other plugin or template which defines this part of the page you will have to do some manual editing. + ---++ Plugin Info | Plugin Author: | TWiki:Main.JoonaKannisto | -| Copyright: | © 2009 TWiki:Main.JoonaKannisto, %BR% © 2009-2010 TWiki:TWiki/TWikiContributor | +| Copyright: | 2009 TWiki:Main.JoonaKannisto, %BR% 2009-2010 TWiki:TWiki/TWikiContributor | | License: | GPL ([[http://www.gnu.org/copyleft/gpl.html][GNU General Public License]]) | -| Plugin Version: | 2010-07-26 (V1.1) | +| Plugin Version: | 2010-10-25 (V1.2) | | Change History: | <!-- versions below in reverse order --> | +| 2010-12-08 | Many new features and improvements | | 2010-07-26 | TWikibug:Item6532 - move to SVN repository; doc fixes; changing TWIKIWEB to SYSTEMWEB | | 2009-11-24: | Initial version | -| TWiki Dependency: | $TWiki::Plugins::VERSION 1.1 | -| CPAN Dependencies: | none | +| TWiki Dependency: | $TWiki::Plugins::VERSION 1.2 | +| CPAN Dependencies: | Locale::Maketext HTML::Entities | | Other Dependencies: | none | | Perl Version: | 5.005 | | [[TWiki:Plugins/Benchmark][Benchmarks]]: | %SYSTEMWEB%.GoodStyle nn%, %SYSTEMWEB%.FormattedSearch nn%, %TOPIC% nn% | @@ -153,4 +167,8 @@ | Feedback: | http://TWiki.org/cgi-bin/view/Plugins/%TOPIC%Dev | | Appraisal: | http://TWiki.org/cgi-bin/view/Plugins/%TOPIC%Appraisal | -__Related Topics:__ ReputationPluginChangeValue, %SYSTEMWEB%.TWikiPlugins, %SYSTEMWEB%.DeveloperDocumentationCategory, %SYSTEMWEB%.AdminDocumentationCategory, %SYSTEMWEB%.TWikiPreferences +__Related Topics:__ %SYSTEMWEB%.ReputationPluginChangeValues, %SYSTEMWEB%.TWikiPlugins, %SYSTEMWEB%.DeveloperDocumentationCategory, %SYSTEMWEB%.AdminDocumentationCategory, %SYSTEMWEB%.TWikiPreferences + +%META:FILEATTACHMENT{name="valuesliders.png" attachment="valuesliders.png" attr="h" comment="Inerface which shows the current trust values and offers easy way to change them." date="1290592736" path="valuesliders.png" size="21762" stream="valuesliders.png" tmpFilename="/usr/tmp/CGItemp3026" user="JoonaKannisto" version="1"}% +%META:FILEATTACHMENT{name="UI.png" attachment="UI.png" attr="h" comment="" date="1291884469" path="UI.png" size="5824" user="SeppoTaalasmaa" version="1"}% +%META:PREFERENCE{name="SKIN" title="SKIN" type="Set" value="pattern"}% Deleted: twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginChangeValue.txt =================================================================== --- twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginChangeValue.txt 2011-02-24 09:04:28 UTC (rev 20505) +++ twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginChangeValue.txt 2011-02-24 11:49:02 UTC (rev 20506) @@ -1,18 +0,0 @@ -%META:TOPICINFO{author="TWikiContributor" date="1280204852" format="1.1" version="$Rev$"}% -%META:TOPICPARENT{name="ReputationPlugin"}% ----+ Update your trust values - -This page can be used for updating the level of trust you have in another TWiki user. - -%REPUTATION{ rpaction="addtrust" addvalue="%URLPARAM{addvalue}%" user="%URLPARAM{wikiname}%" }% -<form name="newnegative" action="ReputationPluginChangeValue"> -<input type="text" name="wikiname" value="Wikiname" /> -<input type="text" name="addvalue" value="" /> -<input type="submit" class="twikiSubmit" value="Change Wikiname's trust value" /> -</form> - ----++ Current trust values (999 is the maximum and 1 is the minimum) - -%REPUTATION{ rpaction="showtrusted" }% - -__Related Topic:__ ReputationPlugin Added: twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginChangeValues.txt =================================================================== --- twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginChangeValues.txt (rev 0) +++ twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginChangeValues.txt 2011-02-24 11:49:02 UTC (rev 20506) @@ -0,0 +1,14 @@ +%META:TOPICINFO{author="JoonaKannisto" date="1298541952" format="1.1" version="1.6"}% +%META:TOPICPARENT{name="TWiki.ReputationPluginInfofi"}% +---+ Update trust values +This page is for changing the personal level of trust you have to another TWiki user. This trust value is used to determine whether votes and recommendations from other users are taken into account when calculating topic scores. +---++Feedback and Instructions: %REPUTATION{rpaction="addtrust" addvalue="%URLPARAM{addvalue}%" user="%URLPARAM{user}%" oldvalue="%URLPARAM{oldvalue}%" slider="%URLPARAM{slider}%"}% +---++ Current trust values (999 is the maximum (fully trusted) and 1 is the minimum (completely untrusted)) +---++Adjust the values with the slider and press *Save* to apply changes. +%REPUTATION{rpaction="showtrusted"}% + + +---++Free form +If you could not find the wikiname you wished to change in the above list, you can use this form to set the trust value. + + <form name="trustform" action="%TOPIC%">Wikiname: <input type="text" name="user" value="" title="Wikiname"/> <p>Value: <input type="text" id="slider-FreeForm"name="addvalue" title="Range: 1 - 999" class="fd_range_1_999 fd_classname_extraclass" value="500"/><input type="hidden" name="oldvalue" value="500"><input type="hidden" name="slider" value="1" ><input type="submit" class="twikiSubmit" value="Save" /></form> \ No newline at end of file Added: twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginInfo.txt =================================================================== --- twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginInfo.txt (rev 0) +++ twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginInfo.txt 2011-02-24 11:49:02 UTC (rev 20506) @@ -0,0 +1,18 @@ +%META:TOPICINFO{author="JoonaKannisto" date="1290674687" format="1.1" reprev="1.5" version="1.5"}% +%META:TOPICPARENT{name="ReputationPlugin"}% +---++ What are the voting options and ratings? + +You can vote topics in this wiki according to their general quality and usefulness. When you encounter a new topic you can use the reviews of other users to make a decision whether to trust the topic's content or to take it with a grain of salt. + +You can list every topic you have voted: [[%SYSTEMWEB%.ReputationPluginVoted]], this is a of bookmark feature for topics that made an impact on you. + +If you want to know which are the most popular topics, toplists for webs can be viewed at [[%SYSTEMWEB%.ReputationPluginToplist]]. + +---++ Reputation and trust + +Because you may not view all the users of this wiki as trustworthy and skilled as others you can make the ratings dependent on your interactions with them. You can set this option on your user page %WIKIUSERNAME% by writing the following setting to your personal preferences. +<verbatim> + * Set REPUTATIONPLUGIN_ABSOLUTE = relative +</verbatim> +After this setting has been selected all the topic ratings which have not been especially marked as absolute values will be relative. +[[TWiki.ReputationPluginChangeValues][Change and observe the value of trust you have to other users on this wiki]]<br /><br /> -- Main.JoonaKannisto - 14 Oct 2010 Added: twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginInfofi.txt =================================================================== --- twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginInfofi.txt (rev 0) +++ twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginInfofi.txt 2011-02-24 11:49:02 UTC (rev 20506) @@ -0,0 +1,8 @@ +%META:TOPICINFO{author="SeppoTaalasmaa" date="1291975900" format="1.1" version="1.3"}% +%META:TOPICPARENT{name="ReputationPlugin"}% +---++ Mitvat estykset ja suosiolaskurit? + +Voit esttikistviivuja ja ktestystuloksia sivujen sisaadun arviointiin. Kaikki estsi aiheet n topicissa [[%SYSTEMWEB%.ReputationPluginVotedfi]]. + +---++ Maineenhallinta ja luottamus +nestyksistertyy topicien kirjoittajille pisteita nen pisteiden perusteella heidluotettavuuttaan arvioijina arvioidaan. Luotettavuutta mitataan luvulla, jonka voit mytse mitellos esimerkiksi tunnet jonkun ktn henkiltaisesti. [[%SYSTEMWEB%.ReputationPluginChangeValues][Muuta luottamusarvoja]]. Oletustilassaan topicien keraine on koko sivuston laajuista, mutta voit muuttaa pisteiden laskutavan suhteelliseksi ja m myinkisella painolla tutut ja tuntemattomat henkiluomioidaan pisteitaskettaessa. Added: twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginToplist.txt =================================================================== --- twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginToplist.txt (rev 0) +++ twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginToplist.txt 2011-02-24 11:49:02 UTC (rev 20506) @@ -0,0 +1,10 @@ +%META:TOPICINFO{author="JoonaKannisto" date="1297085493" format="1.1" reprev="1.4" version="1.4"}% +%META:TOPICPARENT{name="ReputationPluginInfo"}% +---++ See the best topics in a chosen web + +On this page you can get an overview of all the rated topics in any web that is visible to this functionality. The topics are sorted according to their total score, without taking reputation into account. Select the name of the web you are interested in, and press 'Show Votes'. (Separate subwebs with a dot eg. Myweb.Subweb) + +<form name="toplistform" action="%TOPIC%"><select name="web"> %WEBLIST{"<option $marker value=$qname>$name</option>" webs="user,public,allowed" selection="%WEB%" separator=" "}% </select> <input type="submit" class="twikiSubmit" value="Show Votes" /></form> +---++ Web Topics Overview + +%REPUTATION{rpaction="showtoplist" web="%URLPARAM{web}%"}% Added: twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginVoted.txt =================================================================== --- twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginVoted.txt (rev 0) +++ twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginVoted.txt 2011-02-24 11:49:02 UTC (rev 20506) @@ -0,0 +1,5 @@ +%META:TOPICINFO{author="JoonaKannisto" date="1297252133" format="1.1" reprev="1.3" version="1.3"}% +%META:TOPICPARENT{name="ReputationPluginInfo"}% +---+List of topics you have voted +Below is a list of all the topics you have voted. +%REPUTATION{rpaction="showtopics"}% Added: twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginVotedfi.txt =================================================================== --- twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginVotedfi.txt (rev 0) +++ twiki/trunk/ReputationPlugin/data/TWiki/ReputationPluginVotedfi.txt 2011-02-24 11:49:02 UTC (rev 20506) @@ -0,0 +1,5 @@ +%META:TOPICINFO{author="SeppoTaalasmaa" date="1285685873" format="1.1" reprev="1.1" version="1.1"}% +%META:TOPICPARENT{name="TWiki.ReputationPluginInfofi"}% +%REPUTATION{rpaction="showtopics"}% + +-- Main.SeppoTaalasmaa - 28 Sep 2010 Added: twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/Config.spec =================================================================== --- twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/Config.spec (rev 0) +++ twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/Config.spec 2011-02-24 11:49:02 UTC (rev 20506) @@ -0,0 +1,13 @@ +# ---+ ReputationPlugin +# This plugin is used for content rating in TWiki. +# Plugin maintains also information about the reputation of the users in relation to eachother +# **BOOLEAN** +# This option controls whether reputation information from other users is used or not +$TWiki::cfg{Plugins}{ReputationPlugin}{Recommedations} = 0; +# **BOOLEAN** +# Set this option to 1 if you want other voters' votes affect their reputation +$TWiki::cfg{Plugins}{ReputationPlugin}{Voterreputation} = 0; +# **BOOLEAN EXPERT** +# Turn debug mode on or off +$TWiki::cfg{Plugins}{ReputationPlugin}{Debug} = 0; + Added: twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/I18N/en.pm =================================================================== --- twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/I18N/en.pm (rev 0) +++ twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/I18N/en.pm 2011-02-24 11:49:02 UTC (rev 20506) @@ -0,0 +1,3 @@ +package TWiki::Plugins::ReputationPlugin::I18N::en; +use base qw(TWiki::Plugins::ReputationPlugin::I18N); +1; Added: twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/I18N/fi.pm =================================================================== --- twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/I18N/fi.pm (rev 0) +++ twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/I18N/fi.pm 2011-02-24 11:49:02 UTC (rev 20506) @@ -0,0 +1,64 @@ +package TWiki::Plugins::ReputationPlugin::I18N::fi; +# Finnish Language messages for ReputationPlugin +use base qw(Foswiki::Plugins::ReputationPlugin::I18N); +use strict; +use vars qw(%Lexicon); +%Lexicon = ( +"poor" => "surkea", +"negative" => "parannettavaa", +"excellent" => "erinomainen", +"positive" => "hyv +"Remove"=> "Poista", +"Vote"=> "nest +"Trustvalue updated by \"[_1]\" points for user \"[_2]\"" + => "Ktn [_2] luottamusarvoon tehtiin muutos [_1]", +"Wikiname does not exist!" + => "Wikinimei lnyt", +" Invalid number!" + => " Luku on eplpo!", +"Submit existing Wikiname and a negative or positive integer" + => "Syolemassaoleva Wikinimi ja negatiivinen tai positiivinen kokonaisluku", +"Popularity: [_1]/[_2] " + => "Kiinnostavuus: [_1]/[_2] ", +"Rating: [_1] " + => "Pisteet: [_1] ", +" ~[~[[_1].ReputationPluginInfo~]~[Tell Me More~]~]" +=> " ~[~[[_1].ReputationPluginInfofi~]~[Mistn kyse?~]~] ", +"You haven't voted this, not removed." + => "Et ole estt t vaihtoehtoa, joten siti poisteta.", +" removed vote for \"[_1]\" " + => " poistettiin i \"[_1]\" ", +" affecting [quant,_1,user] [_3].[_2]" + => " [quant,_1,ktlttlt[_3].[_2]", +"Vote already done, remove to add again" + => "Olet jo estt t vaihtoehtoa, poista i jos haluat estsitudelleen", +"voted \"[_1]\" " + => "[_1] i annettu ", +"vote not added, topic does not exist or [_1] is not valid" + => "nti lisy, joko annettu i [_1] ei kelpaa tai est aihetta ei ole", +"removed [_1] " + =>"poistettiin [_1] ", +"You voted this topic as \"[_1]\" " + =>"Annoit aiheelle arvosanan \"[_1]\". ", +"The toplist is hidden in this web" + =>"Tn webin lista on piilotettu", +"You have no more \"[_1]\" votes for this web. Remove vote from another topic if you would like to vote this topic instead ~[~[[_2].ReputationPluginVoted~]~]" + => "Sinulla ei ole en\"[_2]\" ielln webiin. Poista i toisesta topicista, jos haluat estt sen sijasta ~[~[[_2].ReputationPluginVotedfi~]~]", +" Vote for \"[_1]\" removed." + => " ni \"[_1]\" poistettiin.", +"Vote not added this option [_1] is not available" + => "nti lisy, vaihtoehto [_1] ei ole saatavilla", +"---++Topics voted as [_1]\n" + => "---++Aiheet arvosanalla \"[_1]\"\n", +"Topic: [_1] Authors: " + => "Aihe: [_1] Kirjoittajat: ", +" Last change is to this topic is made by an author you do not trust" + => " Epotettavaksi arvioitu kt on tehnyt viimeisimmmuutoksen", +" Last change to this topic is made by a user unknown to you" + => " Sinulle ennest tuntematon kirjoittaja on tehnyt viimeisimmmuutoksen" +); +# fin de lexique. + +1; # fin de module. + + Added: twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/I18N/i_default.pm =================================================================== --- twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/I18N/i_default.pm (rev 0) +++ twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/I18N/i_default.pm 2011-02-24 11:49:02 UTC (rev 20506) @@ -0,0 +1,4 @@ +package TWiki::Plugins::ReputationPlugin::I18N::i_default; +use base qw(TWiki::Plugins::ReputationPlugin::I18N); +1; + Added: twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/I18N.pm =================================================================== --- twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/I18N.pm (rev 0) +++ twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/I18N.pm 2011-02-24 11:49:02 UTC (rev 20506) @@ -0,0 +1,25 @@ +package TWiki::Plugins::ReputationPlugin::I18N; + # This is the project base class for "findgrep", an example application + # using Locale::Maketext; + +use Locale::Maketext 1.01; +use base ('Locale::Maketext'); + +# I decree that this project's first language is English. + +%Lexicon = ( + '_AUTO' => 1, + # That means that lookup failures can't happen -- if we get as far + # as looking for something in this lexicon, and we don't find it, + # then automagically set $Lexicon{$key} = $key, before possibly + # compiling it. + + # The exception is keys that start with "_" -- they aren't auto-makeable. + + + + # Any further entries... + +); +# End of lexicon. + Modified: twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/MANIFEST =================================================================== --- twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/MANIFEST 2011-02-24 09:04:28 UTC (rev 20505) +++ twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin/MANIFEST 2011-02-24 11:49:02 UTC (rev 20506) @@ -1,4 +1,36 @@ +data/TWiki/ReputationPluginChangeValues.txt 0644 +data/TWiki/ReputationPluginVotedfi.txt 0644 data/TWiki/ReputationPlugin.txt 0644 -data/TWiki/ReputationPluginChangeValue.txt 0644 +data/TWiki/ReputationPluginInfofi.txt 0444 +data/TWiki/ReputationPluginVoted.txt 0444 +data/TWiki/ReputationPluginToplist.txt 0444 +data/TWiki/ReputationPluginInfo.txt 0444 lib/TWiki/Plugins/ReputationPlugin.pm 0444 +lib/TWiki/Plugins/ReputationPlugin/I18N.pm 0444 +lib/TWiki/Plugins/ReputationPlugin/I18N/i_default.pm 0444 +lib/TWiki/Plugins/ReputationPlugin/I18N/en.pm 0444 +lib/TWiki/Plugins/ReputationPlugin/I18N/fi.pm 0444 +pub/TWiki/ReputationPlugin/slider/slider-1.png 0444 +pub/TWiki/ReputationPlugin/slider/slider-disabled-1.png 0444 +pub/TWiki/ReputationPlugin/slider/slider-disabled.png 0444 +pub/TWiki/ReputationPlugin/slider/slider.png 0444 +pub/TWiki/ReputationPlugin/slider/slider.css 0444 +pub/TWiki/ReputationPlugin/valuesliders.png 0644 +pub/TWiki/ReputationPlugin/UI.png 0644 +pub/TWiki/ReputationPlugin/smiley/positive.gif 0444 +pub/TWiki/ReputationPlugin/smiley/poor.gif 0444 +pub/TWiki/ReputationPlugin/smiley/excellent.gif 0444 +pub/TWiki/ReputationPlugin/smiley/negative.gif 0444 +pub/TWiki/ReputationPlugin/smiley/bg_button_span.gif 0444 +pub/TWiki/ReputationPlugin/smiley/bg_button_a.gif 0444 +pub/TWiki/ReputationPlugin/smiley/buttons.css 0444 +pub/TWiki/ReputationPlugin/js/slider.js 0444 +pub/TWiki/ReputationPlugin/js/hide.js 0444 +pub/TWiki/ReputationPlugin/bar/positive.gif 0444 +pub/TWiki/ReputationPlugin/bar/good.gif 0444 +pub/TWiki/ReputationPlugin/bar/poor.gif 0444 +pub/TWiki/ReputationPlugin/bar/excellent.gif 0444 +pub/TWiki/ReputationPlugin/bar/graph2.css 0444 +pub/TWiki/ReputationPlugin/bar/negative.gif 0444 templates/view.reputation.tmpl 0444 +templates/view.reputation4.tmpl 0444 Modified: twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin.pm =================================================================== --- twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin.pm 2011-02-24 09:04:28 UTC (rev 20505) +++ twiki/trunk/ReputationPlugin/lib/TWiki/Plugins/ReputationPlugin.pm 2011-02-24 11:49:02 UTC (rev 20506) @@ -5,9 +5,8 @@ # Copyright (c) 2007 Crawford Currie, http://c-dot.co.uk # Copyright (c) 2007 Sven Dowideit, SvenDowideit@DistributedINFORMATION.com # Copyright (c) 2007 Arthur Clemens, ar...@vi... -# Copyright (c) 2009 Joona Kannisto -# Copyright (C) 2006-2010 TWiki Contributors -# +# Copyright (c) 2009-2010 Joona Kannisto +# Copyright (c) 2010 Marko Helenius # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 @@ -20,35 +19,44 @@ # http://www.gnu.org/copyleft/gpl.html # # ========================= -# Much of the code for this plugin is taken from TagmePlugin. +# Much of the code for this plugin is taken from TagmePlugin. -# change the package name and $pluginName!!! +# change the package name and $pluginName!!! ...DONE package TWiki::Plugins::ReputationPlugin; # Always use strict to enforce variable scoping use strict; +use warnings; +# Translation support +# TWiki's I18N support is not very fitting for plugins +# something needs to be developed +use TWiki::Plugins::ReputationPlugin::I18N; +use TWiki::Func; +# Updated version with DB access +use BerkeleyDB ; +use MLDBM qw(BerkeleyDB::Btree) ; + # $VERSION is referred to by TWiki, and is the only global variable that # *must* exist in this package. # Global variables used in this plugin -use vars qw($web $topic $user $installWeb $VERSION $RELEASE $SHORTDESCRIPTION - $debug $initialized $pluginName $NO_PREFS_IN_TOPIC $workAreaDir - $logAction $tagLinkFormat $action $absolute $backlinkmax); +use vars qw($web $topic $user $sanitizedtopic $installWeb $VERSION $RELEASE $SHORTDESCRIPTION $debug $pluginName $NO_PREFS_IN_TOPIC $absolute $backlinkmax $LH $workAreaDir + $attachUrl $voterreputation $recommendations $topfile $trustfile $topicfile $userfile); +# This should always be $Rev: 12445$ so that TWiki can determine the checked-in +# status of the plugin. It is used by the build automation tools, so +# you should leave it alone. $VERSION = '$Rev: 12445$'; -$RELEASE = '2010-07-26'; +# This is a free-form string you can use to "name" your own plugin version. +# It is *not* used by the build automation tools, but is reported as part +# of the version number in PLUGINDESCRIPTIONS. +$RELEASE = 'Dakar'; + # Short description of this plugin # One line description, is shown in the %TWIKIWEB%.TextFormattingRules topic: -$SHORTDESCRIPTION = 'Create and maintain user reputation in a TWiki site'; +$SHORTDESCRIPTION = 'Build and manage reputation'; -# You must set $NO_PREFS_IN_TOPIC to 0 if you want your plugin to use preferences -# stored in the plugin topic. This default is required for compatibility with -# older plugins, but imposes a significant performance penalty, and -# is not recommended. Instead, use $TWiki::cfg entries set in LocalSite.cfg, or -# if you want the users to be able to change settings, then use standard TWiki -# preferences that can be defined in your Main.TWikiPreferences and overridden -# at the web and topic level. $NO_PREFS_IN_TOPIC = 1; # Name of this Plugin, only used in this module @@ -65,244 +73,592 @@ WebSearchAdvanced WebStatistics WebTopicList); -$initialized = 0; -#This parser is for topic's vote file, taken from TagmePlugin -our $lineRegex = "^0*([0-9]+), ([^,]+), (.*)"; -# Parser for user's trust file -our $userRegex = "^0*([0-9]+), (.*)"; -# Parser for user's topics file -our $topicRegex = "([^,]+), ([^,]+), (.*)"; + +BEGIN { + + #I18N initialization + if ( $TWiki::cfg{UseLocale} ) { + require locale; + import locale(); + } +} + + +$LH = TWiki::Plugins::ReputationPlugin::I18N->get_handle() +|| die "Can't get a language handle"; + +our $wikiwordRegex=$TWiki::regex{'wikiWordRegex'}; +our $smileybuttons=0; # Weights assigned to each voting option -our %votevalues = ("negative", -1, "positive", 1, "excellent", 2); - -# Needed in credibility function. -# These could be user defined. -# Defined here for faster easier tuning. -our $threshold=500; -our $recommendationthreshold=500; -our $recommendations=1; +# Names shouldn't be changed if the plugin has been in use, if you want to change +# the labels on buttons change buttonstrings +our %votevalues = ("poor", -2, "negative", -1, "positive", 1, "excellent", 2); +our $votenames=join("|",keys %votevalues); +our $voteRegex = "^[$votenames]"; +our %buttonStrings=("poor",$LH->maketext("poor"),"negative",$LH->maketext("negative"),"positive", $LH->maketext("positive"),"excellent",$LH->maketext("excellent")); +# "Vote" clutters the interface, should remove from where it's called +our %actionStrings=("vote",$LH->maketext(""),"remove",$LH->maketext("Remove")); # Weight given to user's own votes our $myweight=1; +our %quotatemplate=("excellent",2,"positive",2,"negative",2, "poor",2); +# Removing magic numbers +our $maxtrustvalue=999; +# Zero is not recommended, because it can be mixed up with undef, +# should use defined in if statements whenever possible, but just +# to be on the safe side. +our $mintrustvalue=1; +our $defaulttrustvalue=500; +# Needed in credibility function. +# Defined here for faster tuning at development stage +our $threshold=$defaulttrustvalue; +our $recommendationthreshold=$maxtrustvalue+1; +our $defaultcredibilityweight=5; -# Maximum number for articles votevalue, not implemented yet -# Votes will be counted even after this, but this is the highest number displayed -our $votemax=20; -# Removing magic numbers -our $maxtrustlinevalue=999; -our $mintrustlinevalue=1; -our $defaulttrustlinevalue=500; +# Use html entities to escape everything returned back to the user in order to prevent XSS +use HTML::Entities; + sub initPlugin { ($topic, $web, $user, $installWeb ) = @_; # check for Plugins.pm versions - if( $TWiki::Plugins::VERSION < 1.026 ) { + if( $TWiki::Plugins::VERSION < 1.2 ) { TWiki::Func::writeWarning( "Version mismatch between $pluginName and Plugins.pm" ); return 0; } + TWiki::Func::registerTagHandler( 'REPUTATION', \&_REPUTATION, 'context-free' ); + $workAreaDir = TWiki::Func::getWorkArea($pluginName); + $userfile = "$workAreaDir/_users.mldbm"; + $topfile = "$workAreaDir/_top.mldbm"; + $topicfile = "$workAreaDir/_topics.mldbm"; + $trustfile = "$workAreaDir/_trust.mldbm"; + # Set plugin preferences in LocalSite.cfg + $debug = $TWiki::cfg{Plugins}{ReputationPlugin}{Debug} || 0; - # Example code of how to get a preference value, register a variable handler - # and register a RESTHandler. (remove code you do not need) - - # Set plugin preferences in LocalSite.cfg, like this: - # $TWiki::cfg{Plugins}{EmptyPlugin}{ExampleSetting} = 1; - # Then recover it like this. Always provide a default in case the - # setting is not defined in LocalSite.cfg - - $debug = $TWiki::cfg{Plugins}{ReputationPlugin}{Debug} || 0; - # Maximum number of backlinks to prevent turning interlinking to a game - # Can be used to disable the backlink search feature if set to 0 - # Backlinksearch may have poor performance with huge number of topics - $backlinkmax = $TWiki::cfg{Plugins}{ReputationPlugin}{Backlinkmax} || 20; # Shows votes without taking voters reputation into account - $absolute = $TWiki::cfg{Plugins}{ReputationPlugin}{Absolute} || 0; + $absolute = TWiki::Func::getPreferencesValue('REPUTATIONPLUGIN_RATINGTYPE') || 1; + if ($absolute eq "relative") { + $absolute = 0; + } + my $theme = TWiki::Func::getPreferencesValue('REPUTATIONPLUGIN_THEME') || 'smiley'; + if ( $theme eq "plain"){ + $smileybuttons=0; + } + else { + $smileybuttons=1; + } # - $initialized = 0; + $attachUrl = TWiki::Func::getPubUrlPath() . "/$installWeb/$pluginName"; + # This should be user configured + $voterreputation=$TWiki::cfg{Plugins}{ReputationPlugin}{Voterreputation} || 0; + if ($voterreputation) { + $threshold=0; + } + else { + $threshold=TWiki::Func::getPreferencesValue('REPUTATIONPLUGIN_TRUSTTHRESHOLD'); + if (defined $threshold && $threshold =~ /(\d+)/) { + $threshold = $1; + } + else { + $threshold=$defaulttrustvalue; + } + } + $recommendationthreshold=TWiki::Func::getPreferencesValue('REPUTATIONPLUGIN_RECOMMENDATIONTHRESHOLD')||$maxtrustvalue+1; + if ($recommendationthreshold =~ /(\d+)/) { + $recommendationthreshold = $1; + } + else { + $recommendationthreshold=$maxtrustvalue+1; + } + if ($recommendationthreshold<=$maxtrustvalue) {$recommendations = 1} + else {$recommendations=0} + + # This doesn't work with mod_perl as it should, plugin initialized previously overrides + # this setting. + my $numberofoptions=TWiki::Func::getPreferencesValue('REPUTATIONPLUGIN_VOTEOPTIONS')||2; + if ($numberofoptions==2) { + %votevalues =("negative", -1, "positive", 1); + } + # mod_perl makes it mandatory to reassign this value, if different voteoptions are + # used in some other web or topic + else { + %votevalues = ("poor", -2, "negative", -1, "positive", 1, "excellent", 2); + } # Plugin correctly initialized return 1; } -sub commonTagsHandler { -### my ( $text, $topic, $web ) = @_; # do not uncomment, use $_[0], $_[1]... instead - - #_writeDebug("commonTagsHandler( $_[2].$_[1] )"); - $_[0] =~ s/%REPUTATION{(.*?)}%/_REPUTATION($1)/ge; -} -sub _initialize { - return if ($initialized); - - # Initialization, this returns /tmp on huuliharppu for some reason (perhaps access rights to /var/lib/twiki/working are wrong or the plugin shouldn't be used in Sandbox Web for the first time - $workAreaDir = TWiki::Func::getWorkArea($pluginName); - - $initialized = 1; -} sub _REPUTATION { - my ($attr) = @_; # attributes which come with TWiki function call - #isGuest function doesn't work (in all TWiki versions) so below is a simple version. - #return '' if (TWiki::Func::isGuest()); - if ($user eq 'guest' || TWiki::Func::getWikiName($user) eq 'TWikiGuest' ){ - return ''; -} - $action = TWiki::Func::extractNameValuePair( $attr, 'rpaction' ); - + my ($session, $params, $thetopic, $theweb) = @_; + my $action = $params->{rpaction} || ''; + my $vote = $params->{vote} || ''; my $text = ''; - _initialize(); + my $access=_accessVote(); # called with rpaction's value vote, in typical case voting button has been pressed - if ( $action eq "vote" ) { - $text = _ADDVOTE($attr); + if ( $action eq "vote" && $access ) { + $text = _ADDVOTE($vote); } - elsif ( $action eq "remove") { - $text = _REMOVEVOTE($attr); + elsif ( $action eq "remove" && $access) { + $text = _REMOVEVOTE($vote); } - # + # elsif ($action eq "showtopics"){ - $text = _SHOWTOPICS($attr); + $text = _SHOWTOPICS(); } elsif ($action eq "showtrusted"){ - $text = _SHOWTRUSTED($attr); + $text = _SHOWTRUSTED(); } elsif ($action eq "addtrust"){ - $text = _trustvalueaddition($attr); + my $addvalue = $params->{addvalue}; + my $wikiname = $params->{user}; + my $oldvalue= $params->{oldvalue}; + my $slider = $params->{slider}; + $text = _trustValueChange($addvalue,$wikiname,$oldvalue,$slider); } + + elsif ($action eq "showgroups" && $TWiki::Plugins::VERSION>=1.2) { + $text = _groupview(); + } + elsif ($action eq "showtoplist") { + my $currentweb= $params->{web}; + $text= _showtoplist($currentweb); + } elsif ($action) { $text = "Unrecognized action"; } # If plugin is called without action just show UI + else { - $text = _showDefault(); + $text = _showDefault(); } return $text; } -# Just printing file's contents, future improvements could include e.g. parsing of the file -# and turning usernames into links. Links could point to either users' homepages or to a generated page made -# for checking and updating that user's trust value + +# Show the topics which the user has voted. sub _SHOWTOPICS { - my $text = TWiki::Func::readFile("$workAreaDir/_topics_$user.txt"); - #Remove comments - $text =~ s/^#.*//g; - # Make newlines new paragraphs, quick and dirty - $text =~ s/\n/<p>/g; - return $text; + my $html=''; + my %topicdb ; + tie %topicdb, 'MLDBM', -Filename => $userfile, + -Flags => DB_CREATE + or die "Cannot open database '$userfile: $!\n"; + if (defined $topicdb{"$user"}) { + my $votes = $topicdb{$user}; + # Build new assoc for sorting data in vote topic order + # only the second level key is unique + my %newassoc ; + foreach $topic (keys %$votes) { + $newassoc{$votes->{$topic}->{'vote'}}{$topic}{'rev'}= $votes->{$topic}->{'rev'}; + @{$newassoc{$votes->{$topic}->{'vote'}}{$topic}{'authors'}}=@{$votes->{$topic}->{'authors'}}; + } + + foreach my $votekey (sort _voteoptionsort keys %newassoc) { + $html.=$LH->maketext("---++Topics voted as [_1]\n", $buttonStrings{$votekey}); + foreach my $topickey (sort keys %{$newassoc{$votekey}}) { + my $revision=$newassoc{$votekey}{$topickey}{'rev'}; + my $authorlist="$TWiki::cfg{UsersWebName}.".join(", $TWiki::cfg{UsersWebName}.",@{$newassoc{$votekey}{$topickey}{'authors'}}); + $html.=$LH->maketext("Topic: ~[~[[_1]~]~] Revision: [_2] Authors: [_3]",$topickey, $revision, $authorlist); + $html.="<br>\n"; + } + } + } + untie %topicdb; + return $html; } -# Manually adjust some users trustvalue. Should support some kind of nonce, in order to -# prevent misuse. -sub _trustvalueaddition { - my ($attr) =@_; - my $text = TWiki::Func::extractNameValuePair( $attr, 'addvalue' ); - my $wikiname = TWiki::Func::extractNameValuePair( $attr, 'user' ); - # Get sign, if any and the number part - $text=~/(\-?|\+?)(\d*)/; - - if ($2 && TWiki::Func::wikiToUserName($wikiname)) { - my $num="$1$2"; - _updateusers($num,$wikiname); - $text="Trustvalue updated for user \"$wikiname\""; +# Manually adjust some users trustvalue. Should support some kind of nonce, in order to +# prevent misuse. Another way to prevent misuse would be to restrict this function's use to spesific topic +sub _trustValueChange { + my ($text, $wikiname)= @_; + if (TWiki::Func::isGuest) { + return _wrapHtmlFeedbackErrorInline ('Please log in to use this functionality'); } + my $exists=TWiki::Func::wikiToUserName($wikiname); + my $nolimit=$TWiki::cfg{Plugins}{ReputationPlugin}{NoRestrictTrustValueChange} ||0; + my $trustvaluechangetopic=$TWiki::cfg{Plugins}{ReputationPlugin}{TrustValueChangeTopic} || 'ReputationPluginChangeValues'; + if (!$nolimit && ($web ne $TWiki::cfg{SystemWebName} || $topic ne $trustvaluechangetopic)) { + return _wrapHtmlFeedbackErrorInline("Trustvalues can be changed only in the provided template topic $TWiki::cfg{SystemWebName}.$trustvaluechangetopic"); + } + $text=~/(\d*)/; + if ($1 && $exists) { + my $previous=0; + $text,$previous=_writeToTRDB($wikiname, $text); + $text=$LH->maketext("Trustvalue updated from [_1] to [_2] points for user \"[_3]\"",$previous, $text, $wikiname); + } + # We didn't get a valid wikiname elsif ($2) { - $text="Wikiname does not exist"; + $text=_wrapHtmlFeedbackErrorInline($LH->maketext("Wikiname does not exist!")); } - elsif (TWiki::Func::wikiToUserName($wikiname)){ - $text.=" does not contain a valid number"; + elsif ($exists){ + + $text.=$LH->maketext(" Invalid number!"); + $text=_wrapHtmlFeedbackErrorInline($text); } + # Both parameters exist, but they are invalid + elsif ($text || $wikiname){ + $text=$text=_wrapHtmlFeedbackErrorInline($LH->maketext("You should submit existing WikiName and a negative or positive integer")); + } + # The user didn't input anything yet else { - $text="Submit existing Wikiname and a negative or positive integer"; + $text=$LH->maketext("Use the sliders or the free form down below."); } return $text; } -# Same as the earlier function. Could include also buttons for trust value manipulation +sub _writeToTRDB { + my ($wikiname,$number)=@_; + $wikiname=TWiki::Func::getWikiName( $wikiname, 1); + $number=~ /\d*/; + + if ($wikiname && $number) { + if ($number>$maxtrustvalue) { + $number=$maxtrustvalue; + } + elsif ($number<$mintrustvalue){ + $number=$mintrustvalue; + } + my %trustdb; + tie %trustdb, 'MLDBM', -Filename => $trustfile, + -Flags => DB_CREATE + 'Lock' => 'File', + 'Lockfile' => '/tmp/Tie-MLDBM-trust.lock' + + or die "Cannot open database '$trustfile: $!\n"; + my $table = $trustdb{$user}; + my $previous=$table->{$wikiname}; + $previous="unknown" unless ($previous); + $table->{$wikiname}=$number; + $trustdb{$user}=$table; + untie %trustdb; + return $number,$previous; + } + else {return "NaN"} +} + +# Simple toplist functionality +sub _showtoplist { + my ($currentweb)=@_; + if (!TWiki::Func::webExists( $currentweb)) { + $currentweb=$web; + } + my $text=''; + # Toplists public by default, preference from web (only the ones with writeaccess to webpreferences can change this) + my $toplisthidden = TWiki::Func::getPreferencesFlag('REPUTATIONPLUGIN_TOPLISTHIDDEN',$currentweb)|| 0; + # If the current user is not an admin and toplist is hidden + if (!TWiki::Func::isAnAdmin() && $toplisthidden) { + $text=$LH->maketext("The toplist is hidden in this web"); + } + # If the user has read permission to this web, it's okay to show topic names + # "empty" text, because we do not want the current topic text to be read + elsif (TWiki::Func::checkAccessPermission( "VIEW", $user, 'empty', 'WebHome', $currentweb, '')&& _accessRead($currentweb)){ + my %toplist = _readTopfile($currentweb); + $text.=$LH->maketext("No entries") if (!scalar keys %toplist); + foreach my $key (sort { $toplist{$b} <=> $toplist{$a} } keys %toplist ) { + $text.="$toplist{$key} [[$currentweb.$key]]<br>\n"; + } + } + return $text; +} +sub _addtotoplist { + my ($value)=@_; + my %topdb ; + tie %topdb, 'MLDBM', -Filename => $topfile, + -Flags => DB_CREATE + 'Lock' => 'File', + 'Lockfile' => '/tmp/Tie-MLDBM-toplist.lock' + or die "Cannot open database '$topfile: $!\n"; + my $webtop= $topdb{$web}; + if ($webtop->{$topic}){ + $webtop->{$topic}=$webtop->{$topic}+$value; + } + else { + $webtop->{$topic}=$value; + } + $topdb{$web}=$webtop; + untie %topdb; +} + +# Show the contents of user's own trusted file, values shown as sliders sub _SHOWTRUSTED { - my $text = TWiki::Func::readFile("$workAreaDir/_trusted_$user.txt"); - #Remove comments - $text =~ s/^#.*//g; - # Make newlines new paragraphs, quick and dirty - $text =~ s/\n/<p>/g; - return $text; + my (%trusted)=_readTrusted($user); + my $text=''; + # Insert external javascript to header + my $headtext="<script type=\"text/javascript\" src=\"$attachUrl/js/slider.js\"></script>"; + my $id="REPUTATIONPLUGIN_SLIDERJS"; + TWiki::Func::addToHEAD( $id, $headtext); + # Insert css for the sliders + $text.="<link href=\"$attachUrl/slider/slider.css\" media=\"all\" rel=\"stylesheet\" type=\"text/css\" />"; + #$text.="<fieldset>"; + $text.='<style type="text/css" media="screen"> +fieldset + { + margin:0; + padding:1em; + text-align:left; + } +div.extraclass + { + width:20.6em; + float:left; + } +</style>'; + $text.='<table>'; + # Every line in trust file gets its own form (a form with only one submit button could be easier to use + # but the parameters would be much harder to collect) + foreach my $key (sort { $trusted{$b} <=> $trusted{$a} } keys %trusted ) { + $text .="\n<form name\=\"new$key\""; + $text .=' action="%TOPIC%" method="post">'; + $text .='<tr><td>'; + $text.="<input type=\"hidden\" name=\"rpaction\" value=\"addtrust\"/>"; + $text.="<input type=\"hidden\" name=\"user\" value=\"$key\"/>"; + $text .="<label for=\"slider-$key\">$key</label></td><td> + <input name=\"addvalue\" id=\"slider-$key\" type=\"text\" title=\"Range: 1 - 999\" class=\"fd_range_$mintrustvalue"; + $text .="_$maxtrustvalue fd_classname_extraclass\" value=\"$trusted{$key}\"/>"; + $text.="<input type=\"hidden\" name=\"slider\" value=\"1\"/>"; + $text.="<input type=\"hidden\" name=\"oldvalue\" value=\"$trusted{$key}\"/>"; + $text.="</td><td><input type\=\"submit\" class\=\"twikiSubmit\" value=\"Save\"/><br>"... [truncated message content] |