欢迎来到THBWiki!
如果您是第一次来到这里,请点击右上角注册一个帐户
有任何意见、建议、求助、反馈都可以在
讨论板
提出
THBWiki以专业性和准确性为目标,如果你发现了任何确定的错误或疏漏,可在登录后直接进行改正
查看“帮助:成就扩展”的源代码
←
帮助:成就扩展
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
少女
您没有权限编辑
帮助
命名空间内的页面。
您可以查看和复制此页面的源代码。
'''成就扩展'''([https://github.com/arumi-s/MW-Achievements Github])是一个提供用户成就及用户头衔的Mediawiki插件,可以设置多种成就触发条件,不过某几种条件需要手动修改一下MediaWiki/其他扩展代码才能正常运作。推荐同时安装[https://www.mediawiki.org/wiki/Extension:SocialProfile SocialProfile]及[https://www.mediawiki.org/wiki/Extension:Echo Echo]。 == 安装 == # 你需要最新版本(0.4.0)的<code>Achievements.zip</code>。 # 解压到<code>extensions</code>目录下。 # 在<code>LocalSettings.php</code>一处加上<code>require_once( "$IP/extensions/Achievements/Achievements.php" );</code><ref>本扩展目前不支持使用extension.json加载</ref>。 # 如要使用某几种类型,需要[[#修改地方|修改几个地方]]。 # 在SQL数据库执行本扩展目录下的<code>manual_import.sql</code><ref>因为执行mw-config很麻烦所以只做了手动创建数据表的代码</ref>。 # 安装完成。 # 按需要设定[[特殊:管理成就|管理成就]]对应的“manageachievements”权限。 # 按需要[[#设定cron|设定cron]]。 # 按需要[[#设定成就|设定成就]]。 == 配置 == * '''$wgAchievementsIconStaged''',分阶段成就的默认图标,默认为'''Wiki LOGO'''。 * '''$wgAchievementsIconNormal''',普通成就的默认图标,默认为'''Wiki LOGO'''。 * '''$wgAchievementsTokenLength''',[[特殊:兑换成就|成就兑换码]]的长度,更改此值时需要修改[[MediaWiki:redeem-achiev-token-help|对应的说明Message]],默认为“'''10'''”。 * '''$wgAchievementsScoring''',是否启用成就计分及等级功能,默认为“'''false'''”。 * '''$wgAchievementsConfigs''',设定成就的关联数组,详见[[#设定成就|设定成就]]。 == 成就类型 == ;static : 静态成就,需通过兑换码来获取。 ;editcount : 编辑计数,可指定只计算某页面的子页面、某分类或某名字空间下的编辑次数。 ;edittop : 编辑计数排名,可指定只计算某页面的子页面、某分类或某名字空间下的编辑次数。 ;friendcount : 好友计数,好友系统是SocialProfile的一个功能,使用此类型需要[[#SocialProfile|修改部分SocialProfile代码]]。 ;friendtop : 好友计数排名,好友系统是SocialProfile的一个功能,使用此类型需要[[#SocialProfile|修改部分SocialProfile代码]]。 ;foecount : 仇敌计数,好友系统是SocialProfile的一个功能,使用此类型需要[[#SocialProfile|修改部分SocialProfile代码]]。 ;foetop : 仇敌计数排名,好友系统是SocialProfile的一个功能,使用此类型需要[[#SocialProfile|修改部分SocialProfile代码]]。 ;frienduser : 与指定用户成为好友,好友系统是SocialProfile的一个功能,使用此类型需要[[#SocialProfile|修改部分SocialProfile代码]]。 ;watch : 页面监视计数,可指定只计算某页面的子页面、某分类或某名字空间下的页面监视次数,使用此类型需要[[#MediaWiki|修改部分MediaWiki代码]]。 ;usergroup : 用户组计数,可指定用户组属于特定用户组时触发。 ;userprop : 用户设定计数,可指定用户设定某种内容时触发。 ;useravatar : 用户头像计数,头像系统是SocialProfile的一个功能。 ;useremail : 用户验证邮件计数。 ;registerday : 注册日数,使用此类型需要设定cron执行日更脚本。 ;viewcount : 用户浏览计数,可以设定计数几率降低服务器写入负担。 ;viewtop : 用户浏览计数排名,可以设定计数几率降低服务器写入负担。 ;random : 随机计数,原理为在现在和指定时间后之间随机选个时间,那个时间后第一个浏览的用户便会获得计数。 == 设定cron == [[wzh:Cron|Cron]]是Linux系统中用于设置周期性被执行的指令,在这里用于定时更新计数器(例:registerday)及刷新并处理设定了定时更新的成就。进行上述操作的PHP脚本位于MW根目录下(<code>/extensions/Achievements/scripts/reset.php</code>),需要指定参数<code>--i</code>刷新对应时间更新的成就。 例如执行<code>/extensions/Achievements/scripts/reset.php --i m</code>便会刷新所有每月更新的成就,根据设定不同可能会收发对应成就、清空计数器或增加计数。所有可用的间隔为“<code>d</code>”(每日)、“<code>w</code>”(每周)和“<code>m</code>”(每月),你也可以通过Cron设置更多时间间隔并将成就设定成使用该间隔。 以下是设置Cron的范例: :<code>0 22 * * * PHP路径 MW根目录/extensions/Achievements/scripts/reset.php --i d > /dev/null 2>&1</code><br /> 会在 每日 06:00 更新 :<code>0 23 * * 0 PHP路径 MW根目录/extensions/Achievements/scripts/reset.php --i w > /dev/null 2>&1</code><br /> 会在 每周一 07:00 更新 :<code>0 0 1 * * PHP路径 MW根目录/extensions/Achievements/scripts/reset.php --i m > /dev/null 2>&1</code><br /> 会在 每月一号 08:00 更新 具体在每天每周每月哪个时间点更新是无所谓的,不过注意更新操作可能需要一点时间,对于[[THBWiki|本站]]规模的用户量和成就量大概需要一分钟,为了能更准时更新建议把更新时间错开。 另外也可以自行添加更多间隔种类,例如“<code>q</code>”表示每季: :<code>0 0 1 1,4,7,10 * PHP路径 MW根目录/extensions/Achievements/scripts/reset.php --i q > /dev/null 2>&1</code> 如果使用了不同于以上设置的更新时间,就需要更改与更新间隔相关的几个Message: * [[MediaWiki:achiev-config-reset-d]] : {{int:achiev-config-reset-d}} * [[MediaWiki:achiev-config-reset-d-desc]] : {{int:achiev-config-reset-d-desc}} * [[MediaWiki:achiev-config-reset-w]] : {{int:achiev-config-reset-w}} * [[MediaWiki:achiev-config-reset-w-desc]] : {{int:achiev-config-reset-w-desc}} * [[MediaWiki:achiev-config-reset-m]] : {{int:achiev-config-reset-m}} * [[MediaWiki:achiev-config-reset-m-desc]] : {{int:achiev-config-reset-m-desc}} 如果添加了更多间隔种类,就需要用以下格式增加几个Message: * [[MediaWiki:achiev-config-reset-代号]] * [[MediaWiki:achiev-config-reset-代号-desc]] == 设定成就 == 大致可以参考本扩展目录下的[https://github.com/arumi-s/MW-Achievements/blob/master/Achievements.settings.example.php Achievements.settings.example.php]。所有成就可以设定的基本项目都是一样的,只是用了不同的<code>type</code>的成就<code>counter</code>里面的参数会有点差异,默认值也可能不一样,具体可以参考放在<code>class/counters</code>下的计数器Class。 所有成就通用的基本项目: * '''type''',文本,[[#成就类型|成就计数器类型]],默认为“'''static'''”(静态)。 * '''image''',文本或null,设定成就图标,会在各种地方随着成就显示,适当尺寸为60px×60px,默认为'''[[#配置|默认图标]]'''。 * '''counter''',数组,计数器的设定,不同成就类型会需要不同的参数。 * '''reset''',文本或false,设定[[#设定cron|更新间隔]],初始可用“'''d'''”、“'''w'''”、“'''m'''”,默认为“'''false'''”。 * '''threshold''',数字或数组,用数字设定单阶段成就,只有一个阶段,用户达到了就会触发;用数组设定分多个阶段的成就,用户进度达到一个阶段值就会获得对应成就,默认为“'''1'''”。 * '''scoremul''',数字,设定成就分数乘数,会在[[#成就计分|自动计算的分数]]上再乘以此数得出此成就的分数,默认为“'''1'''”。 * '''exclude''',文本或数组或false,设定一个或多个跟此成就互斥的成就,只要用户已经拥有列表中其中一个成就此成就将'''无法'''触发,默认为“'''false'''”。 * '''multiple''',布尔值,设定成就可重复颁发,设为“'''true'''”时用户再次满足成就要求时会再次颁发此成就,仅对设定了'''reset'''参数的成就有效,默认为“'''false'''”。 * '''removable''',布尔值,设定成就可移除,设为“'''true'''”时用户不满足此成就条件时会失去此成就,默认为“'''false'''”。 * '''awardable''',布尔值,设定成就可颁发,设为“'''true'''”时此成就便可以由管理员颁发,默认为“'''false'''”。 * '''hidden''',布尔值,设定是否隐藏成就,设为“'''true'''”时此成就就不会自动在用户成就列表中出现,只有拥有此成就的用户才能看到,默认为“'''false'''”。 * '''active''',布尔值,设定是否活跃成就,设为“'''true'''”时便是活跃成就,默认为“'''true'''”。 * '''activerange''',数组或false,设定限时成就的时限,设为“'''['开始UTC时间戳', '结束UTC时间戳']'''”(例:“['20180317160000', '20180318160000']”表示东8区2018年3月18日0时到2018年3月19日0时)时此成就将仅在以上期间内有效,默认为“'''false'''”。 编写设定时创建并写到<code>Achievements.settings.php</code>里就可以了。 添加新成就后需要为该新成就执行[[#initAchievementCounter.php|初始化脚本]],“计数器初始值为0”及“只能手动颁发”的成就可以省略此步骤。 == 脚本 == === reset.php === 用于定时更新的脚本,[[#设定cron|设定cron]]自动执行,切勿手动执行。<br /> 可用参数: * <code>--i</code>,指定间隔代号。 * <code>--nohook</code>,防止执行<code>RegularJobs::间隔代号</code>Hook。 === initAchievementCounter.php === 用于初始化成就,于数据库写入计数器初始值,给已经达成成就条件的用户颁发成就。对于“计数器初始值为current”的成就,重复初始化不但不会造成bug,而且可以修正计数器长时间累计可能造成的误差,成就条件更改后也可以通过再初始化重新颁发及消去成就。<br /> 可用参数: * <code>--achiev</code>,指定需要初始化的成就ID。 * <code>--counter</code>,指定需要初始化的成就计数器类型,这种方法可以一次过刷新多个同类成就。 * <code>--all</code>,初始化所有成就。 * <code>--alluser</code>,设定初始化范围包含所有用户,默认初始化只会包含有编辑的用户,适用于初始化编辑数类成就时节省无谓的开销,而一些跟编辑数无关的成就例如好友数就需要设定此参数确保所有用户都有机会获得成就。 * <code>--reset</code>,设定初始化范围包含设定了周期更新的成就,默认初始化不会包含设定了周期更新的成就,避免长时间累积的计数被重设成0。 * <code>--suppress</code>,防止发出获得及失去成就Echo通知。 == 特殊页面 == === [[特殊:管理成就|管理成就]] === * 需要“manageachievements”权限,用于选择执行所有管理操作。 === [[特殊:兑换成就|兑换成就]] === * 用于兑换成就,兑换码可在[[特殊:管理成就|管理成就]]由有足够权限的用户生成。 == 成就计分 == 系统会自动根据成绩的类型、设定及估计难度计算合适的成就分数,管理员亦可以设定'''[[#设定成就|scoremul]]'''参数改变成就的分数。具体计算函数参见[https://github.com/arumi-s/MW-Achievements/blob/master/class/AchievementClass.php AchievementClass.php 中的 getStageScore 函数]。 === 等级计算 === 每个等级都有对应的分数,用户有足够分数时便会升至该等级。等级所需分数公式如下: 所需分数=等级×(等级+2)×10 前10级所需分数简表: {| class="wikitable" ! 等级 !! 所需分数 |- | 1 || 30 |- | 2 || 80 |- | 3 || 150 |- | 4 || 240 |- | 5 || 350 |- | 6 || 480 |- | 7 || 630 |- | 8 || 800 |- | 9 || 990 |- | 10 || 1200 |} == 功能展望 == 以下列表中提及的功能均尚未实现,亦不保证以后必定会有,仅供参考。 * 更好的[[特殊:管理成就]]界面,增加各个模式之间的链接。 * 更改头衔文本样式的方法,例如更改字体颜色大小。 * 增加设定获取成就的基本门槛的功能,即用户需要满足一定条件才可以开始获得成就,防止自动颁发过多成就(例如注册日数成就)给不活跃的账户增加数据库负担。 * 更多预设成就图标。 * 更多类型的计数器。 == 修改地方 == 如果你不使用需要修改的那几个类型,不修改是不会出BUG的。 === MediaWiki === ==== /includes/specials/SpecialEditWatchlist.php ==== <code>private function SpecialEditWatchlist::clearWatchlist</code>内增加在清空监视列表时触发Hook的功能。 {| style="width:100%" |- |<syntaxhighlight lang="php" highlight=""> $dbw = wfGetDB( DB_MASTER ); $dbw->delete( 'watchlist', [ 'wl_user' => $this->getUser()->getId() ], __METHOD__ ); </syntaxhighlight> |改成 |<syntaxhighlight lang="php" highlight="7"> $dbw = wfGetDB( DB_MASTER ); $dbw->delete( 'watchlist', [ 'wl_user' => $this->getUser()->getId() ], __METHOD__ ); Hooks::run( 'WatchArticleClearComplete', [ $this->getUser() ] ); </syntaxhighlight> |} === SocialProfile === ==== /UserRelationship/UserRelationshipClass.php ==== <code>public function UserRelationship::addRelationship</code>内把输入Hook的用户名称改成更容易识别的用户ID。 {| style="width:100%" |- |<syntaxhighlight lang="php" highlight="2,4"> if ( $ur_type == 1 ) { Hooks::run( 'NewFriendAccepted', array( $ur_user_name_from, $this->user_name ) ); } else { Hooks::run( 'NewFoeAccepted', array( $ur_user_name_from, $this->user_name ) ); } </syntaxhighlight> |改成 |<syntaxhighlight lang="php" highlight="2,4"> if ( $ur_type == 1 ) { Hooks::run( 'NewFriendAccepted', array( $ur_user_id_from, $this->user_id ) ); } else { Hooks::run( 'NewFoeAccepted', array( $ur_user_id_from, $this->user_id ) ); } </syntaxhighlight> |} <code>public function UserRelationship::removeRelationshipByUserID</code>内增加把取消关系类型信息也加进Hook里的功能。 {| style="width:100%" |- |<syntaxhighlight lang="php" highlight="2"> $dbw = wfGetDB( DB_MASTER ); $dbw->delete( 'user_relationship', array( 'r_user_id' => $user1, 'r_user_id_relation' => $user2 ), __METHOD__ ); </syntaxhighlight> |改成 |<syntaxhighlight lang="php" highlight="2-7"> $dbw = wfGetDB( DB_MASTER ); $rel_type = (int)($dbw->selectField( 'user_relationship', 'r_type', array( 'r_user_id' => $user1, 'r_user_id_relation' => $user2 ), __METHOD__ )); $dbw->delete( 'user_relationship', array( 'r_user_id' => $user1, 'r_user_id_relation' => $user2 ), __METHOD__ ); </syntaxhighlight> |} 以及 {| style="width:100%" |- |<syntaxhighlight lang="php" highlight="1"> Hooks::run( 'RelationshipRemovedByUserID', array( $user1, $user2 ) ); </syntaxhighlight> |改成 |<syntaxhighlight lang="php" highlight="1"> Hooks::run( 'RelationshipRemovedByUserID', array( $user1, $user2, $rel_type ) ); </syntaxhighlight> |} == 注释 == <references/> [[分类:扩展帮助文档]]
返回
帮助:成就扩展
。
导航菜单
个人工具
创建账号
登录
命名空间
帮助
讨论
查看
阅读
源码
查看历史
更多
搜索
常用
首页
东方Project
上海爱丽丝幻乐团
ZUN
幻想乡
幻想乡年表
东方年表
东方同人规约
近期新闻
沙盒(建议使用)
讨论板
加入我们
官方作品
官方游戏
旧作
东方灵异传
东方封魔录
东方梦时空
东方幻想乡
东方怪绮谈
东方红魔乡
东方妖妖梦
东方永夜抄
东方花映塚
东方风神录
东方地灵殿
东方星莲船
东方神灵庙
东方辉针城
东方绀珠传
东方天空璋
东方鬼形兽
东方虹龙洞
东方兽王园
小数点射击游戏
东方文花帖
东方文花帖DS
妖精大战争
弹幕天邪鬼
秘封噩梦日记
弹幕狂们的黑市
黄昏边境合作游戏
东方萃梦想
东方绯想天
东方非想天则
东方心绮楼
东方深秘录
东方凭依华
东方刚欲异闻
官方音乐
原曲列表
非音乐CD音乐列表
音乐CD曲目列表
蓬莱人形
莲台野夜行
梦违科学世纪
卯酉东海道
大空魔术
未知之花 魅知之旅
鸟船遗迹
伊奘诺物质
燕石博物志
旧约酒馆
虹色的北斗七星
七夕坂梦幻能
幺乐团的历史系列
幺乐团的历史 vol.1
幺乐团的历史 vol.2
幺乐团的历史 vol.3
幺乐团的历史 vol.4
幺乐团的历史 vol.5
格斗游戏OST
幻想曲拔萃
全人类的天乐录
核热造神非想天则
暗黑能乐集心绮楼
深秘乐曲集
深秘乐曲集·补
完全凭依唱片名录
贪欲之兽的音乐
商业出版物附带CD
官方书籍
东方香霖堂
东方三月精
第一季
月之妖精
第二季
第三季
第四季
东方文花帖
风之号外
东方紫香花
六十年不见的紫香花
东方儚月抄
漫画
小说
四格
东方茨歌仙
东方铃奈庵
东方醉蝶华
东方智灵奇传
东方求闻史纪
记忆幻想乡
东方求闻口授
魔理沙的魔法书
宇佐见的魔法书
东方外来韦编
东方文果真报
东方人妖名鉴
宵暗篇
常世篇
幻想Narrato Graph
官方角色
公式资料
附带文档
游戏对话
官方作品光盘信息
角色自称用词表
官作译名更改记录
原作物品列表
出典文献列表
其他ZUN参与的作品
西方Project
黄昏酒场
东方关联人物
游戏攻略
东方相关活动
从第二家开始的广播
东方STATION
数码游戏博览会
PoriPori☆Club
niconico超会议
斗会议
niconico原创游戏祭
枯萎Radio
GDGD
其他相关项目
东方我乐多丛志
东方四方山新闻
Play,Doujin!
东方电书流通
东方音乐流通
二次创作与活动
展会及活动导航
Comic Market
博丽神社例大祭
博丽神社例大祭SP
博丽神社秋季例大祭
博丽神社例大祭in台湾
海外博丽神社例大祭
博丽神社歌谣祭
博丽神社崇敬会相关活动
COMICUP
上海THONLY
东方Only活动
东方红楼梦
角色Only活动
作品Only活动
地区Only活动
其他地区举办的展会
其他展会
M3
COMIC1
展会作品列表
展会作品数量
展会同人志列表
展会专辑列表
展会软件列表
展会视频列表
商业二次创作
电脑游戏
东方月神夜
家用机游戏
Play,Doujin
手机游戏
东方大炮弹
东方LostWord
东方Dungeon Dive
东方弹幕神乐
东方幻想Eclipse
同人二次创作
同人社团列表
同人志分类
同人专辑分类
同人专辑搜索
原曲作品数量
同人软件列表
Steam游戏列表
同人角色列表
同人视频列表
其他形式同人
同人文章列表
同人画师列表
同人封面角色
东方相关周边
PVCFigure
GarageKit
小型物品
其他形式周边
MUGEN
THB相关项目
THB策划
中文东方人气投票
东深见讲坛
幻想乡柱状地图
THB衍生
同人专辑搜索
原曲认知测验
东方相关QQ群组列表
THB媒体
微博
Bilibili
直播间
GitHub
THB协力
博丽神主ZUN微博
东方我乐多丛志
MineCraft幻想乡
京都幻想剧团
幻奏盛宴
功能与帮助
最近更改
随机浏览
编写规范
收录方针
命名规范
同人社团
同人音乐
封面图片
二次设定
编辑帮助
基础帮助
常用模板
进阶代码
函数用法
编写翻译表
语义维基
样式类用法
颜色列表
工具
链入页面
相关更改
特殊页面
页面信息
其他
联系管理员
关于THBWiki
捐款支持
语言
English
italiano
日本語
中文