PageRenderTime 49ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/source/admincp/admincp_tasks.php

https://github.com/jinbo51/DiscuzX
PHP | 713 lines | 605 code | 102 blank | 6 comment | 172 complexity | 11ca06163423b91b60259fb4978a4eb1 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. <?php
  2. /**
  3. * [Discuz!] (C)2001-2099 Comsenz Inc.
  4. * This is NOT a freeware, use is subject to license terms
  5. *
  6. * $Id: admincp_tasks.php 30363 2012-05-24 07:16:47Z monkey $
  7. */
  8. if(!defined('IN_DISCUZ') || !defined('IN_ADMINCP')) {
  9. exit('Access Denied');
  10. }
  11. cpheader();
  12. $id = intval($_GET['id']);
  13. $membervars = array('act', 'num', 'time');
  14. $postvars = array('act', 'forumid', 'num', 'time', 'threadid', 'authorid');
  15. $modvars = array();
  16. $custom_types = C::t('common_setting')->fetch('tasktypes', true);
  17. $custom_scripts = array_keys($custom_types);
  18. $submenus = array();
  19. foreach($custom_types as $k => $v) {
  20. $submenus[] = array($v['name'], "tasks&operation=add&script=$k", $_GET['script'] == $k);
  21. }
  22. if(!($operation)) {
  23. if(!submitcheck('tasksubmit')) {
  24. shownav('extended', 'nav_tasks');
  25. showsubmenu('nav_tasks', array(
  26. array('admin', 'tasks', 1),
  27. $submenus ? array(array('menu' => 'add', 'submenu' => $submenus)) : array(),
  28. array('nav_task_type', 'tasks&operation=type', 0)
  29. ));
  30. showformheader('tasks');
  31. showtableheader();
  32. showsetting('tasks_on', 'taskonnew', $_G['setting']['taskon'], 'radio');
  33. showtablefooter();
  34. showtableheader('tasks_list', 'fixpadding');
  35. showsubtitle(array('display_order', 'available', 'name', 'tasks_reward', 'time', ''));
  36. $starttasks = array();
  37. foreach(C::t('common_task')->fetch_all_data() as $task) {
  38. if($task['reward'] == 'credit') {
  39. $reward = cplang('credits').' '.$_G['setting']['extcredits'][$task['prize']]['title'].' '.$task['bonus'].' '.$_G['setting']['extcredits'][$task['prize']]['unit'];
  40. } elseif($task['reward'] == 'magic') {
  41. $magicname = C::t('common_magic')->fetch($task['prize']);
  42. $reward = cplang('tasks_reward_magic').' '.$magicname['name'].' '.$task['bonus'].' '.cplang('magic_unit');
  43. } elseif($task['reward'] == 'medal') {
  44. $medalname = C::t('forum_medal')->fetch($task['prize']);
  45. $reward = cplang('medals').' '.$medalname['name'].($task['bonus'] ? ' '.cplang('validity').$task['bonus'].' '.cplang('days') : '');
  46. } elseif($task['reward'] == 'invite') {
  47. $reward = cplang('tasks_reward_invite').' '.$task['prize'].($task['bonus'] ? ' '.cplang('validity').$task['bonus'].' '.cplang('days') : '');
  48. } elseif($task['reward'] == 'group') {
  49. $group = C::t('common_usergroup')->fetch($task['prize']);
  50. $grouptitle = $group['grouptitle'];
  51. $reward = cplang('usergroup').' '.$grouptitle.($task['bonus'] ? ' '.cplang('validity').' '.$task['bonus'].' '.cplang('days') : '');
  52. } else {
  53. $reward = cplang('none');
  54. }
  55. if($task['available'] == '1' && (!$task['starttime'] || $task['starttime'] <= TIMESTAMP) && (!$task['endtime'] || $task['endtime'] > TIMESTAMP)) {
  56. $starttasks[] = $task['taskid'];
  57. }
  58. $checked = $task['available'] ? ' checked="checked"' : '';
  59. if($task['starttime'] && $task['endtime']) {
  60. $task['time'] = dgmdate($task['starttime'], 'y-m-d H:i').' ~ '.dgmdate($task['endtime'], 'y-m-d H:i');
  61. } elseif($task['starttime'] && !$task['endtime']) {
  62. $task['time'] = dgmdate($task['starttime'], 'y-m-d H:i').' '.cplang('tasks_online');
  63. } elseif(!$task['starttime'] && $task['endtime']) {
  64. $task['time'] = dgmdate($task['endtime'], 'y-m-d H:i').' '.cplang('tasks_offline');
  65. } else {
  66. $task['time'] = cplang('nolimit');
  67. }
  68. showtablerow('', array('class="td25"', 'class="td25"'), array(
  69. '<input type="text" class="txt" name="displayordernew['.$task['taskid'].']" value="'.$task['displayorder'].'" size="3" />',
  70. "<input class=\"checkbox\" type=\"checkbox\" name=\"availablenew[$task[taskid]]\" value=\"1\"$checked><input type=\"hidden\" name=\"availableold[$task[taskid]]\" value=\"$task[available]\">",
  71. "<input type=\"text\" class=\"txt\" name=\"namenew[$task[taskid]]\" size=\"20\" value=\"$task[name]\"><input type=\"hidden\" name=\"nameold[$task[taskid]]\" value=\"$task[name]\">",
  72. $reward,
  73. $task['time'].'<input type="hidden" name="scriptnamenew['.$task['taskid'].']" value="'.$task['scriptname'].'">',
  74. "<a href=\"".ADMINSCRIPT."?action=tasks&operation=edit&id=$task[taskid]\" class=\"act\">$lang[edit]</a>&nbsp;&nbsp;<a href=\"".ADMINSCRIPT."?action=tasks&operation=delete&id=$task[taskid]\" class=\"act\">$lang[delete]</a>"
  75. ));
  76. }
  77. if($starttasks) {
  78. C::t('common_task')->update($starttasks, array('available' => 2));
  79. }
  80. showsubmit('tasksubmit', 'submit');
  81. showtablefooter();
  82. showformfooter();
  83. } else {
  84. $checksettingsok = TRUE;
  85. if(is_array($_GET['namenew'])) {
  86. foreach($_GET['namenew'] as $id => $name) {
  87. $_GET['availablenew'][$id] = $_GET['availablenew'][$id] && (!$starttimenew[$id] || $starttimenew[$id] <= TIMESTAMP) && (!$endtimenew[$id] || $endtimenew[$id] > TIMESTAMP) ? 2 : $_GET['availablenew'][$id];
  88. $update = array('name' => dhtmlspecialchars($_GET['namenew'][$id]), 'available' => $_GET['availablenew'][$id]);
  89. if(isset($_GET['displayordernew'][$id])) {
  90. $update['displayorder'] = $_GET['displayordernew'][$id];
  91. }
  92. C::t('common_task')->update($id, $update);
  93. }
  94. }
  95. if($_GET['taskonnew'] != $_G['setting']['taskon']) {
  96. C::t('common_setting')->update('taskon', $_GET['taskonnew']);
  97. }
  98. updatecache('setting');
  99. if($checksettingsok) {
  100. cpmsg('tasks_succeed', 'action=tasks', 'succeed');
  101. } else {
  102. cpmsg('tasks_setting_invalid', '', 'error');
  103. }
  104. }
  105. } elseif($operation == 'add' && $_GET['script']) {
  106. $task_name = $task_description = $task_icon = $task_period = $task_periodtype = $task_conditions = '';
  107. if(in_array($_GET['script'], $custom_scripts)) {
  108. $escript = explode(':', $_GET['script']);
  109. if(count($escript) > 1) {
  110. include_once DISCUZ_ROOT.'./source/plugin/'.$escript[0].'/task/task_'.$escript[1].'.php';
  111. $taskclass = 'task_'.$escript[1];
  112. } else {
  113. require_once libfile('task/'.$_GET['script'], 'class');
  114. $taskclass = 'task_'.$_GET['script'];
  115. }
  116. $task = new $taskclass;
  117. $task_name = lang('task/'.$_GET['script'], $task->name);
  118. $task_description = lang('task/'.$_GET['script'], $task->description);
  119. $task_icon = $task->icon;
  120. $task_period = $task->period;
  121. $task_periodtype = $task->periodtype;
  122. $task_conditions = $task->conditions;
  123. } else {
  124. cpmsg('parameters_error', '', 'error');
  125. }
  126. if(!submitcheck('addsubmit')) {
  127. echo '<script type="text/javascript" src="static/js/calendar.js"></script>';
  128. shownav('extended', 'nav_tasks');
  129. showsubmenu('nav_tasks', array(
  130. array('admin', 'tasks', 0),
  131. array(array('menu' => 'add', 'submenu' => $submenus), 1),
  132. array('nav_task_type', 'tasks&operation=type', 0)
  133. ));
  134. showformheader('tasks&operation=add&script='.$_GET['script']);
  135. showtableheader('tasks_add_basic', 'fixpadding');
  136. showsetting('tasks_add_name', 'name', $task_name, 'text');
  137. showsetting('tasks_add_desc', 'description', $task_description, 'textarea');
  138. if(count($escript) > 1 && file_exists(DISCUZ_ROOT.'./source/plugin/'.$escript[0].'/task/task_'.$escript[1].'.gif')) {
  139. $defaulticon = 'source/plugin/'.$escript[0].'/task/task_'.$escript[1].'.gif';
  140. } else {
  141. $defaulticon = 'static/image/task/task.gif';
  142. }
  143. showsetting('tasks_add_icon', 'iconnew', $task_icon, 'text', '', 0, cplang('tasks_add_icon_comment', array('defaulticon' => $defaulticon)));
  144. showsetting('tasks_add_starttime', 'starttime', '', 'calendar', '', 0, '', 1);
  145. showsetting('tasks_add_endtime', 'endtime', '', 'calendar', '', 0, '', 1);
  146. showsetting('tasks_add_periodtype', array('periodtype', array(
  147. array(0, cplang('tasks_add_periodtype_hour')),
  148. array(1, cplang('tasks_add_periodtype_day')),
  149. array(2, cplang('tasks_add_periodtype_week')),
  150. array(3, cplang('tasks_add_periodtype_month')),
  151. )), $task_periodtype, 'mradio');
  152. showsetting('tasks_add_period', 'period', $task_period, 'text');
  153. showsetting('tasks_add_reward', array('reward', array(
  154. array('', cplang('none'), array('reward_credit' => 'none', 'reward_magic' => 'none', 'reward_medal' => 'none', 'reward_group' => 'none', 'reward_invite' => 'none')),
  155. array('credit', cplang('credits'), array('reward_credit' => '', 'reward_magic' => 'none', 'reward_medal' => 'none', 'reward_group' => 'none', 'reward_invite' => 'none')),
  156. $_G['setting']['magicstatus'] ? array('magic', cplang('tasks_reward_magic'), array('reward_credit' => 'none', 'reward_magic' => '', 'reward_medal' => 'none', 'reward_group' => 'none', 'reward_invite' => 'none')) : '',
  157. $_G['setting']['medalstatus'] ? array('medal', cplang('medals'), array('reward_credit' => 'none', 'reward_magic' => 'none', 'reward_medal' => '', 'reward_group' => 'none', 'reward_invite' => 'none')) : '',
  158. $_G['setting']['regstatus'] > 1 ? array('invite', cplang('tasks_reward_invite'), array('reward_credit' => 'none', 'reward_magic' => 'none', 'reward_medal' => 'none', 'reward_group' => 'none', 'reward_invite' => '')) : '',
  159. array('group', cplang('tasks_add_group'), array('reward_credit' => 'none', 'reward_magic' => 'none', 'reward_medal' => 'none', 'reward_group' => '', 'reward_invite' => 'none'))
  160. )), '', 'mradio');
  161. $extcreditarray = array(array(0, cplang('select')));
  162. foreach($_G['setting']['extcredits'] as $creditid => $extcredit) {
  163. $extcreditarray[] = array($creditid, $extcredit['title']);
  164. }
  165. showtagheader('tbody', 'reward_credit');
  166. showsetting('tasks_add_extcredit', array('prize_credit', $extcreditarray), 0, 'select');
  167. showsetting('tasks_add_credits', 'bonus_credit', '0', 'text');
  168. showtagfooter('tbody');
  169. showtagheader('tbody', 'reward_magic');
  170. showsetting('tasks_add_magicname', array('prize_magic', C::t('common_magic')->fetch_all_name_by_available()), 0, 'select');
  171. showsetting('tasks_add_magicnum', 'bonus_magic', '0', 'text');
  172. showtagfooter('tbody');
  173. showtagheader('tbody', 'reward_medal');
  174. showsetting('tasks_add_medalname', array('prize_medal', C::t('forum_medal')->fetch_all_name_by_available()), 0, 'select');
  175. showsetting('tasks_add_medalexp', 'bonus_medal', '', 'text');
  176. showtagfooter('tbody');
  177. showtagheader('tbody', 'reward_invite');
  178. showsetting('tasks_add_invitenum', 'prize_invite', '1', 'text');
  179. showsetting('tasks_add_inviteexp', 'bonus_invite', '10', 'text');
  180. showtagfooter('tbody');
  181. showtagheader('tbody', 'reward_group');
  182. showsetting('tasks_add_group', array('prize_group', C::t('common_usergroup')->fetch_all_by_type('special', 0)), 0, 'select');
  183. showsetting('tasks_add_groupexp', 'bonus_group', '', 'text');
  184. showtagfooter('tbody');
  185. showtitle('tasks_add_appyperm');
  186. showsetting('tasks_add_groupperm', array('grouplimit', array(
  187. array('all', cplang('tasks_add_group_all'), array('specialgroup' => 'none')),
  188. array('member', cplang('tasks_add_group_member'), array('specialgroup' => 'none')),
  189. array('admin', cplang('tasks_add_group_admin'), array('specialgroup' => 'none')),
  190. array('special', cplang('tasks_add_group_special'), array('specialgroup' => ''))
  191. )), 'all', 'mradio');
  192. showtagheader('tbody', 'specialgroup');
  193. showsetting('tasks_add_usergroup', array('applyperm[]', C::t('common_usergroup')->fetch_all_by_type()), 0, 'mselect');
  194. showtagfooter('tbody');
  195. showsetting('tasks_add_maxnum', 'tasklimits', '', 'text');
  196. if(is_array($task_conditions)) {
  197. foreach($task_conditions as $taskvarkey => $taskvar) {
  198. if($taskvar['sort'] == 'apply' && $taskvar['title']) {
  199. if(!empty($taskvar['value']) && is_array($taskvar['value'])) {
  200. foreach($taskvar['value'] as $k => $v) {
  201. $taskvar['value'][$k][1] = lang('task/'.$_GET['script'], $taskvar['value'][$k][1]);
  202. }
  203. }
  204. $varname = in_array($taskvar['type'], array('mradio', 'mcheckbox', 'select', 'mselect')) ?
  205. ($taskvar['type'] == 'mselect' ? array($taskvarkey.'[]', $taskvar['value']) : array($taskvarkey, $taskvar['value']))
  206. : $taskvarkey;
  207. $comment = lang('task/'.$_GET['script'], $taskvar['title'].'_comment');
  208. $comment = $comment != $taskvar['title'].'_comment' ? $comment : '';
  209. showsetting(lang('task/'.$_GET['script'], $taskvar['title']).':', $varname, $taskvar['value'], $taskvar['type'], '', 0, $comment);
  210. }
  211. }
  212. }
  213. showtitle('tasks_add_conditions');
  214. if(in_array($_GET['script'], $custom_scripts)) {
  215. $haveconditions = false;
  216. if(is_array($task_conditions)) {
  217. foreach($task_conditions as $taskvarkey => $taskvar) {
  218. if($taskvar['sort'] == 'complete' && $taskvar['title']) {
  219. if(!empty($taskvar['value']) && is_array($taskvar['value'])) {
  220. foreach($taskvar['value'] as $k => $v) {
  221. $taskvar['value'][$k][1] = lang('task/'.$_GET['script'], $taskvar['value'][$k][1]);
  222. }
  223. }
  224. $haveconditions = true;
  225. $varname = in_array($taskvar['type'], array('mradio', 'mcheckbox', 'select', 'mselect')) ?
  226. ($taskvar['type'] == 'mselect' ? array($taskvarkey.'[]', $taskvar['value']) : array($taskvarkey, $taskvar['value']))
  227. : $taskvarkey;
  228. $comment = lang('task/'.$_GET['script'], $taskvar['title'].'_comment');
  229. $comment = $comment != $taskvar['title'].'_comment' ? $comment : '';
  230. showsetting(lang('task/'.$_GET['script'], $taskvar['title']).':', $varname, $taskvar['default'], $taskvar['type'], '', 0, $comment);
  231. }
  232. }
  233. }
  234. if(!$haveconditions) {
  235. showtablerow('', 'class="td27" colspan="2"', cplang('nolimit'));
  236. }
  237. }
  238. showsubmit('addsubmit', 'submit');
  239. showtablefooter();
  240. showformfooter();
  241. } else {
  242. $applyperm = $_GET['grouplimit'] == 'special' && is_array($_GET['applyperm']) ? implode("\t", $_GET['applyperm']) : $_GET['grouplimit'];
  243. $_GET['starttime'] = strtotime($_GET['starttime']);
  244. $_GET['endtime'] = strtotime($_GET['endtime']);
  245. $reward = $_GET['reward'];
  246. $prize = $_GET['prize_'.$reward];
  247. $bonus = $_GET['bonus_'.$reward];
  248. if(!$_GET['name'] || !$_GET['description']) {
  249. cpmsg('tasks_basic_invalid', '', 'error');
  250. } elseif(($_GET['endtime'] && $_GET['endtime'] <= TIMESTAMP) || ($_GET['starttime'] && $_GET['endtime'] && $_GET['endtime'] <= $_GET['starttime'])) {
  251. cpmsg('tasks_time_invalid', '', 'error');
  252. } elseif($reward && (!$prize || ($reward == 'credit' && !$bonus))) {
  253. cpmsg('tasks_reward_invalid', '', 'error');
  254. }
  255. $data = array(
  256. 'relatedtaskid' => $_GET['relatedtaskid'],
  257. 'available' => 0,
  258. 'name' => $_GET['name'],
  259. 'description' => $_GET['description'],
  260. 'icon' => $_GET['iconnew'],
  261. 'tasklimits' => $_GET['tasklimits'],
  262. 'applyperm' => $applyperm,
  263. 'scriptname' => $_GET['script'],
  264. 'starttime' => $_GET['starttime'],
  265. 'endtime' => $_GET['endtime'],
  266. 'period' => $_GET['period'],
  267. 'periodtype' => $_GET['periodtype'],
  268. 'reward' => $reward,
  269. 'prize' => $prize,
  270. 'bonus' => $bonus,
  271. );
  272. $taskid = C::t('common_task')->insert($data, true);
  273. if(is_array($task_conditions)) {
  274. foreach($task_conditions as $taskvarkey => $taskvars) {
  275. if($taskvars['title']) {
  276. $comment = lang('task/'.$_GET['script'], $taskvars['title'].'_comment');
  277. $comment = $comment != $taskvars['title'].'_comment' ? $comment : '';
  278. $data = array(
  279. 'taskid' => $taskid,
  280. 'sort' => $taskvars['sort'],
  281. 'name' => lang('task/'.$_GET['script'], $taskvars['title']),
  282. 'description' => $comment,
  283. 'variable' => $taskvarkey,
  284. 'value' => is_array($_GET[''.$taskvarkey]) ? serialize($_GET[''.$taskvarkey]) : $_GET[''.$taskvarkey],
  285. 'type' => $taskvars['type'],
  286. );
  287. C::t('common_taskvar')->insert($data);
  288. }
  289. }
  290. }
  291. cpmsg('tasks_succeed', "action=tasks", 'succeed');
  292. }
  293. } elseif($operation == 'edit' && $id) {
  294. $task = C::t('common_task')->fetch($id);
  295. if(!submitcheck('editsubmit')) {
  296. echo '<script type="text/javascript" src="static/js/calendar.js"></script>';
  297. shownav('extended', 'nav_tasks');
  298. showsubmenu('nav_tasks', array(
  299. array('admin', 'tasks', 0),
  300. array(array('menu' => 'add', 'submenu' => $submenus)),
  301. array('nav_task_type', 'tasks&operation=type', 0)
  302. ));
  303. $escript = explode(':', $task['scriptname']);
  304. showformheader('tasks&operation=edit&id='.$id);
  305. showtableheader(cplang('tasks_edit').' - '.$task['name'], 'fixpadding');
  306. showsetting('tasks_add_name', 'name', $task['name'], 'text');
  307. showsetting('tasks_add_desc', 'description', $task['description'], 'textarea');
  308. if(count($escript) > 1 && file_exists(DISCUZ_ROOT.'./source/plugin/'.$escript[0].'/task/task_'.$escript[1].'.gif')) {
  309. $defaulticon = 'source/plugin/'.$escript[0].'/task/task_'.$escript[1].'.gif';
  310. } else {
  311. $defaulticon = 'static/image/task/task.gif';
  312. }
  313. showsetting('tasks_add_icon', 'iconnew', $task['icon'], 'text', '', 0, cplang('tasks_add_icon_comment', array('defaulticon' => $defaulticon)));
  314. showsetting('tasks_add_starttime', 'starttime', $task['starttime'] ? dgmdate($task['starttime'], 'Y-m-d H:i') : '', 'calendar', '', 0, '', 1);
  315. showsetting('tasks_add_endtime', 'endtime', $task['endtime'] ? dgmdate($task['endtime'], 'Y-m-d H:i') : '', 'calendar', '', 0, '', 1);
  316. showsetting('tasks_add_periodtype', array('periodtype', array(
  317. array(0, cplang('tasks_add_periodtype_hour')),
  318. array(1, cplang('tasks_add_periodtype_day')),
  319. array(2, cplang('tasks_add_periodtype_week')),
  320. array(3, cplang('tasks_add_periodtype_month')),
  321. )), $task['periodtype'], 'mradio');
  322. showsetting('tasks_add_period', 'period', $task['period'], 'text');
  323. showsetting('tasks_add_reward', array('reward', array(
  324. array('', cplang('none'), array('reward_credit' => 'none', 'reward_magic' => 'none', 'reward_medal' => 'none', 'reward_group' => 'none')),
  325. array('credit', cplang('credits'), array('reward_credit' => '', 'reward_magic' => 'none', 'reward_medal' => 'none', 'reward_group' => 'none')),
  326. $_G['setting']['magicstatus'] ? array('magic', cplang('tasks_reward_magic'), array('reward_credit' => 'none', 'reward_magic' => '', 'reward_medal' => 'none', 'reward_group' => 'none')) : '',
  327. $_G['setting']['medalstatus'] ? array('medal', cplang('medals'), array('reward_credit' => 'none', 'reward_magic' => 'none', 'reward_medal' => '', 'reward_group' => 'none')) : '',
  328. $_G['setting']['regstatus'] > 1 ? array('invite', cplang('tasks_reward_invite'), array('reward_credit' => 'none', 'reward_magic' => 'none', 'reward_medal' => 'none', 'reward_group' => 'none', 'reward_invite' => '')) : '',
  329. array('group', cplang('tasks_add_group'), array('reward_credit' => 'none', 'reward_magic' => 'none', 'reward_medal' => 'none', 'reward_group' => ''))
  330. )), $task['reward'], 'mradio');
  331. $extcreditarray = array(array(0, cplang('select')));
  332. foreach($_G['setting']['extcredits'] as $creditid => $extcredit) {
  333. $extcreditarray[] = array($creditid, $extcredit['title']);
  334. }
  335. showtagheader('tbody', 'reward_credit', $task['reward'] == 'credit');
  336. showsetting('tasks_add_extcredit', array('prize_credit', $extcreditarray), $task['prize'], 'select');
  337. showsetting('tasks_add_credits', 'bonus_credit', $task['bonus'], 'text');
  338. showtagfooter('tbody');
  339. showtagheader('tbody', 'reward_magic', $task['reward'] == 'magic');
  340. showsetting('tasks_add_magicname', array('prize_magic', C::t('common_magic')->fetch_all_name_by_available()), $task['prize'], 'select');
  341. showsetting('tasks_add_magicnum', 'bonus_magic', $task['bonus'], 'text');
  342. showtagfooter('tbody');
  343. showtagheader('tbody', 'reward_medal', $task['reward'] == 'medal');
  344. showsetting('tasks_add_medalname', array('prize_medal', C::t('forum_medal')->fetch_all_name_by_available()), $task['prize'], 'select');
  345. showsetting('tasks_add_medalexp', 'bonus_medal', $task['bonus'], 'text');
  346. showtagfooter('tbody');
  347. showtagheader('tbody', 'reward_invite', $task['reward'] == 'invite');
  348. showsetting('tasks_add_invitenum', 'prize_invite', $task['prize'], 'text');
  349. showsetting('tasks_add_inviteexp', 'bonus_invite', $task['bonus'], 'text');
  350. showtagfooter('tbody');
  351. showtagheader('tbody', 'reward_group', $task['reward'] == 'group');
  352. showsetting('tasks_add_group', array('prize_group', C::t('common_usergroup')->fetch_all_by_type('special', 0)), $task['prize'], 'select');
  353. showsetting('tasks_add_groupexp', 'bonus_group', $task['bonus'], 'text');
  354. showtagfooter('tbody');
  355. showtitle('tasks_add_appyperm');
  356. if(!$task['applyperm']) {
  357. $task['applyperm'] = 'all';
  358. }
  359. $task['grouplimit'] = in_array($task['applyperm'], array('all', 'member', 'admin')) ? $task['applyperm'] : 'special';
  360. showsetting('tasks_add_groupperm', array('grouplimit', array(
  361. array('all', cplang('tasks_add_group_all'), array('specialgroup' => 'none')),
  362. array('member', cplang('tasks_add_group_member'), array('specialgroup' => 'none')),
  363. array('admin', cplang('tasks_add_group_admin'), array('specialgroup' => 'none')),
  364. array('special', cplang('tasks_add_group_special'), array('specialgroup' => ''))
  365. )), $task['grouplimit'], 'mradio');
  366. showtagheader('tbody', 'specialgroup', $task['grouplimit'] == 'special');
  367. showsetting('tasks_add_usergroup', array('applyperm[]', C::t('common_usergroup')->fetch_all_by_type()), explode("\t", $task['applyperm']), 'mselect');
  368. showtagfooter('tbody');
  369. $tasklist = array(0 => array('taskid'=>0, 'name'=>cplang('nolimit') ));
  370. foreach(C::t('common_task')->fetch_all_by_available(2) as $value) {
  371. if($value['taskid'] != $task['taskid']) {
  372. $tasklist[$value['taskid']] = array('taskid'=>$value['taskid'], 'name'=>$value['name']);
  373. }
  374. }
  375. showsetting('tasks_add_relatedtask', array('relatedtaskid', $tasklist), $task['relatedtaskid'], 'select');
  376. showsetting('tasks_add_maxnum', 'tasklimits', $task['tasklimits'], 'text');
  377. $taskvars = array();
  378. foreach(C::t('common_taskvar')->fetch_all_by_taskid($id) as $taskvar) {
  379. if($taskvar['sort'] == 'apply') {
  380. $taskvars['apply'][] = $taskvar;
  381. } elseif($taskvar['sort'] == 'complete') {
  382. $taskvars['complete'][$taskvar['variable']] = $taskvar;
  383. } elseif($taskvar['sort'] == 'setting' && $taskvar['name']) {
  384. $taskvars['setting'][$taskvar['variable']] = $taskvar;
  385. }
  386. }
  387. if($taskvars['apply']) {
  388. foreach($taskvars['apply'] as $taskvar) {
  389. showsetting($taskvar['name'], $taskvar['variable'], $taskvar['value'], $taskvar['type'], '', 0, $taskvar['description']);
  390. }
  391. }
  392. showtitle('tasks_add_conditions');
  393. if(count($escript) > 1) {
  394. include_once DISCUZ_ROOT.'./source/plugin/'.$escript[0].'/task/task_'.$escript[1].'.php';
  395. $taskclass = 'task_'.$escript[1];
  396. } else {
  397. require_once libfile('task/'.$task['scriptname'], 'class');
  398. $taskclass = 'task_'.$task['scriptname'];
  399. }
  400. $taskcv = new $taskclass;
  401. if($taskvars['complete']) {
  402. foreach($taskvars['complete'] as $taskvar) {
  403. $taskcvar = $taskcv->conditions[$taskvar['variable']];
  404. if(is_array($taskcvar['value'])) {
  405. foreach($taskcvar['value'] as $k => $v) {
  406. $taskcvar['value'][$k][1] = lang('task/'.$task['scriptname'], $taskcvar['value'][$k][1]);
  407. }
  408. }
  409. $varname = in_array($taskvar['type'], array('mradio', 'mcheckbox', 'select', 'mselect')) ?
  410. ($taskvar['type'] == 'mselect' ? array($taskvar['variable'].'[]', $taskcvar['value']) : array($taskvar['variable'], $taskcvar['value']))
  411. : $taskvar['variable'];
  412. if(in_array($taskvar['type'], array('mcheckbox', 'mselect'))) {
  413. $taskvar['value'] = dunserialize($taskvar['value']);
  414. }
  415. showsetting($taskvar['name'], $varname, $taskvar['value'], $taskvar['type'], '', 0, $taskvar['description']);
  416. }
  417. } else {
  418. showtablerow('', 'class="td27" colspan="2"', cplang('nolimit'));
  419. }
  420. showsubmit('editsubmit', 'submit');
  421. showtablefooter();
  422. showformfooter();
  423. } else {
  424. $applyperm = $_GET['grouplimit'] == 'special' && is_array($_GET['applyperm']) ? implode("\t", $_GET['applyperm']) : $_GET['grouplimit'];
  425. $_GET['starttime'] = strtotime($_GET['starttime']);
  426. $_GET['endtime'] = strtotime($_GET['endtime']);
  427. $reward = $_GET['reward'];
  428. $prize = $_GET['prize_'.$reward];
  429. $bonus = $_GET['bonus_'.$reward];
  430. if(!$_GET['name'] || !$_GET['description']) {
  431. cpmsg('tasks_basic_invalid', '', 'error');
  432. } elseif(($_GET['starttime'] != $task['starttime'] || $_GET['endtime'] != $task['endtime']) && (($_GET['endtime'] && $_GET['endtime'] <= TIMESTAMP) || ($_GET['starttime'] && $_GET['endtime'] && $_GET['endtime'] <= $_GET['starttime']))) {
  433. cpmsg('tasks_time_invalid', '', 'error');
  434. } elseif($reward && (!$prize || ($reward == 'credit' && !$bonus))) {
  435. cpmsg('tasks_reward_invalid', '', 'error');
  436. }
  437. if($task['available'] == '2' && ($_GET['starttime'] > TIMESTAMP || ($_GET['endtime'] && $_GET['endtime'] <= TIMESTAMP))) {
  438. C::t('common_task')->update($id, array('available' => 1));
  439. }
  440. if($task['available'] == '1' && (!$_GET['starttime'] || $_GET['starttime'] <= TIMESTAMP) && (!$_GET['endtime'] || $_GET['endtime'] > TIMESTAMP)) {
  441. C::t('common_task')->update($id, array('available' => 2));
  442. }
  443. $itemarray = array();
  444. foreach(C::t('common_taskvar')->fetch_all_by_taskid($id, 'IS NOT NULL') as $taskvar) {
  445. $itemarray[] = $taskvar['variable'];
  446. }
  447. C::t('common_task')->update($id, array(
  448. 'relatedtaskid' => $_GET['relatedtaskid'],
  449. 'name' => $_GET['name'],
  450. 'description' => $_GET['description'],
  451. 'icon' => $_GET['iconnew'],
  452. 'tasklimits' => $_GET['tasklimits'],
  453. 'applyperm' => $applyperm,
  454. 'starttime' => $_GET['starttime'],
  455. 'endtime' => $_GET['endtime'],
  456. 'period' => $_GET['period'],
  457. 'periodtype' => $_GET['periodtype'],
  458. 'reward' => $reward,
  459. 'prize' => $prize,
  460. 'bonus' => $bonus,
  461. ));
  462. foreach($itemarray as $item) {
  463. $value = $_GET[''.$item];
  464. if(in_array($item, array('num', 'time', 'threadid'))) {
  465. $value = intval($value);
  466. }
  467. if($value !== null) {
  468. C::t('common_taskvar')->update_by_taskid($id, $item, array('value' => is_array($value) ? serialize($value) : $value));
  469. }
  470. }
  471. cpmsg('tasks_succeed', "action=tasks", 'succeed');
  472. }
  473. } elseif($operation == 'delete' && $id) {
  474. if(!$_GET['confirmed']) {
  475. cpmsg('tasks_del_confirm', "action=tasks&operation=delete&id=$id", 'form');
  476. }
  477. C::t('common_task')->delete($id);
  478. C::t('common_taskvar')->delete_by_taskid($id);
  479. C::t('common_mytask')->delete(0, $id);
  480. cpmsg('tasks_del', 'action=tasks', 'succeed');
  481. } elseif($operation == 'type') {
  482. shownav('extended', 'nav_tasks');
  483. showsubmenu('nav_tasks', array(
  484. array('admin', 'tasks', 0),
  485. $submenus ? array(array('menu' => 'add', 'submenu' => $submenus)) : array(),
  486. array('nav_task_type', 'tasks&operation=type', 1)
  487. ));
  488. showtips('tasks_tips_add_type');
  489. $tasks = gettasks();
  490. showtableheader('', 'fixpadding');
  491. if($tasks) {
  492. showsubtitle(array('name', 'tasks_version', 'copyright', ''));
  493. foreach($tasks as $task) {
  494. showtablerow('', '', array(
  495. $task['name'].($task['filemtime'] > TIMESTAMP - 86400 ? ' <font color="red">New!</font>' : ''),
  496. $task['version'],
  497. $task['copyright'],
  498. in_array($task['class'], $custom_scripts) ? "<a href=\"".ADMINSCRIPT."?action=tasks&operation=upgrade&script=$task[class]\" class=\"act\">$lang[tasks_upgrade]</a> <a href=\"".ADMINSCRIPT."?action=tasks&operation=uninstall&script=$task[class]\" class=\"act\">$lang[tasks_uninstall]</a><br />" : "<a href=\"".ADMINSCRIPT."?action=tasks&operation=install&script=$task[class]\" class=\"act\">$lang[tasks_install]</a>"
  499. ));
  500. }
  501. } else {
  502. showtablerow('', '', $lang['task_module_nonexistence']);
  503. }
  504. showtablefooter();
  505. } elseif($operation == 'install' && $_GET['script']) {
  506. if(C::t('common_task')->count_by_scriptname($_GET['script'])) {
  507. cpmsg('tasks_install_duplicate', '', 'error');
  508. }
  509. $escript = explode(':', $_GET['script']);
  510. if(count($escript) > 1) {
  511. include_once DISCUZ_ROOT.'./source/plugin/'.$escript[0].'/task/task_'.$escript[1].'.php';
  512. $taskclass = 'task_'.$escript[1];
  513. } else {
  514. require_once libfile('task/'.$_GET['script'], 'class');
  515. $taskclass = 'task_'.$_GET['script'];
  516. }
  517. $task = new $taskclass;
  518. if(method_exists($task, 'install')) {
  519. $task->install();
  520. }
  521. $custom_types[$_GET['script']] = array('name' => lang('task/'.$_GET['script'], $task->name), 'version' => $task->version);
  522. C::t('common_setting')->update('tasktypes', $custom_types);
  523. cpmsg('tasks_installed', 'action=tasks&operation=type', 'succeed');
  524. } elseif($operation == 'uninstall' && $_GET['script']) {
  525. if(!$_GET['confirmed']) {
  526. cpmsg('tasks_uninstall_confirm', "action=tasks&operation=uninstall&script={$_GET['script']}", 'form');
  527. }
  528. $ids = array();
  529. foreach(C::t('common_task')->fetch_all_by_scriptname($_GET['script']) as $task) {
  530. $ids[] = $task['taskid'];
  531. }
  532. if($ids) {
  533. C::t('common_task')->delete($ids);
  534. C::t('common_taskvar')->delete_by_taskid($ids);
  535. C::t('common_mytask')->delete(0, $ids);
  536. }
  537. $escript = explode(':', $_GET['script']);
  538. if(count($escript) > 1) {
  539. include_once DISCUZ_ROOT.'./source/plugin/'.$escript[0].'/task/task_'.$escript[1].'.php';
  540. $taskclass = 'task_'.$escript[1];
  541. } else {
  542. require_once libfile('task/'.$_GET['script'], 'class');
  543. $taskclass = 'task_'.$_GET['script'];
  544. }
  545. $task = new $taskclass;
  546. if(method_exists($task, 'uninstall')) {
  547. $task->uninstall();
  548. }
  549. unset($custom_types[$_GET['script']]);
  550. C::t('common_setting')->update('tasktypes', $custom_types);
  551. cpmsg('tasks_uninstalled', 'action=tasks&operation=type', 'succeed');
  552. } elseif($operation == 'upgrade' && $_GET['script']) {
  553. $escript = explode(':', $_GET['script']);
  554. if(count($escript) > 1) {
  555. include_once DISCUZ_ROOT.'./source/plugin/'.$escript[0].'/task/task_'.$escript[1].'.php';
  556. $taskclass = 'task_'.$escript[1];
  557. } else {
  558. require_once libfile('task/'.$_GET['script'], 'class');
  559. $taskclass = 'task_'.$_GET['script'];
  560. }
  561. $task = new $taskclass;
  562. if($custom_types[$_GET['script']]['version'] >= $task->version) {
  563. cpmsg('tasks_newest', '', 'error');
  564. }
  565. if(method_exists($task, 'upgrade')) {
  566. $task->upgrade();
  567. }
  568. $task->name = lang('task/'.$_GET['script'], $task->name);
  569. $task->description = lang('task/'.$_GET['script'], $task->description);
  570. C::t('common_task')->update_by_scriptname($_GET['script'], array('version' => $task->version));
  571. $custom_types[$_GET['script']] = array('name' => $task->name, 'version' => $task->version);
  572. C::t('common_setting')->update('tasktypes', $custom_types);
  573. cpmsg('tasks_updated', 'action=tasks&operation=type', 'succeed');
  574. }
  575. function gettasks() {
  576. global $_G;
  577. $checkdirs = array_merge(array(''), $_G['setting']['plugins']['available']);
  578. $tasks = array();
  579. foreach($checkdirs as $key) {
  580. if($key) {
  581. $dir = DISCUZ_ROOT.'./source/plugin/'.$key.'/task';
  582. } else {
  583. $dir = DISCUZ_ROOT.'./source/class/task';
  584. }
  585. if(!file_exists($dir)) {
  586. continue;
  587. }
  588. $taskdir = dir($dir);
  589. while($entry = $taskdir->read()) {
  590. if(!in_array($entry, array('.', '..')) && preg_match("/^task\_[\w\.]+$/", $entry) && substr($entry, -4) == '.php' && strlen($entry) < 30 && is_file($dir.'/'.$entry)) {
  591. @include_once $dir.'/'.$entry;
  592. $taskclass = substr($entry, 0, -4);
  593. if(class_exists($taskclass)) {
  594. $task = new $taskclass();
  595. $script = substr($taskclass, 5);
  596. $script = ($key ? $key.':' : '').$script;
  597. $tasks[$entry] = array(
  598. 'class' => $script,
  599. 'name' => lang('task/'.$script, $task->name),
  600. 'version' => $task->version,
  601. 'copyright' => lang('task/'.$script, $task->copyright),
  602. 'filemtime' => @filemtime($dir.'/'.$entry)
  603. );
  604. }
  605. }
  606. }
  607. }
  608. uasort($tasks, 'filemtimesort');
  609. return $tasks;
  610. }
  611. ?>