PageRenderTime 28ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/app.function.php

https://github.com/nigelbaor/TeamToy
PHP | 825 lines | 764 code | 50 blank | 11 comment | 35 complexity | 171596300288ac4c80411938f38824a5 MD5 | raw file
Possible License(s): AGPL-1.0
  1. <?php
  2. if( !defined('SAE_TMP_PATH') )
  3. {
  4. @mkdir( AROOT . DS . 'tmp');
  5. define('SAE_TMP_PATH', AROOT . DS . 'tmp' . DS );
  6. }
  7. function not_empty( $str )
  8. {
  9. return strlen( $str ) > 0;
  10. }
  11. // From aoihome.sinaapp.com/fun via Aoi [is_email]
  12. function is_email( $email )
  13. {
  14. return filter_var( $email , FILTER_VALIDATE_EMAIL );
  15. }
  16. function on_sae()
  17. {
  18. return defined('SAE_ACCESSKEY') && (substr( SAE_ACCESSKEY , 0 , 4 ) != 'kapp') ;
  19. }
  20. function is_online( $uid )
  21. {
  22. $sql = "SELECT * FROM `online` WHERE `uid` = '" . intval( $uid ) . "' AND `last_active` > '" . date( "Y-m-d H:i:s" , strtotime("-5 minutes") ) . "' LIMIT 1";
  23. return get_line( $sql );
  24. }
  25. function is_installed()
  26. {
  27. if( !db()) return false;
  28. return mysql_query("SHOW COLUMNS FROM `user`",db());
  29. }
  30. function kset( $key , $value )
  31. {
  32. $sql = "REPLACE INTO `keyvalue` ( `key` , `value` ) VALUES ( '" . s($key) . "' , '" . s($value) . "' )";
  33. run_sql( $sql );
  34. }
  35. function kget( $key )
  36. {
  37. return get_var( "SELECT `value` FROM `keyvalue` WHERE `key` = '" . s($key) . "' LIMIT 1" );
  38. }
  39. function kdel( $key )
  40. {
  41. $sql = "DELETE FROM `keyvalue` WHERE `key` = '" . s($key) . "' LIMIT 1" ;
  42. run_sql($sql);
  43. }
  44. function local_version()
  45. {
  46. return intval(file_get_contents(AROOT.'version.txt'));
  47. }
  48. function db_init()
  49. {
  50. $password = substr( md5( time().rand(1,9999) ) , rand( 1 , 20 ) , 12 );
  51. $sql_contents = preg_replace( "/(#.+[\r|\n]*)/" , '' , file_get_contents( AROOT . 'misc' . DS . 'install.sql'));
  52. // 更换变量
  53. $sql_contents = str_replace( '{password}' , md5($password) , $sql_contents );
  54. $sqls = split_sql_file( $sql_contents );
  55. foreach ($sqls as $sql)
  56. {
  57. run_sql( $sql );
  58. }
  59. if( db_errno() == 0 )
  60. {
  61. info_page(__('DATABASE_INIT_FINISHED' , $password ));
  62. exit;
  63. }
  64. else
  65. {
  66. info_page( db_error() );
  67. exit;
  68. }
  69. }
  70. function split_sql_file($sql, $delimiter = ';')
  71. {
  72. $sql = trim($sql);
  73. $char = '';
  74. $last_char = '';
  75. $ret = array();
  76. $string_start = '';
  77. $in_string = FALSE;
  78. $escaped_backslash = FALSE;
  79. for ($i = 0; $i < strlen($sql); ++$i) {
  80. $char = $sql[$i];
  81. // if delimiter found, add the parsed part to the returned array
  82. if ($char == $delimiter && !$in_string) {
  83. $ret[] = substr($sql, 0, $i);
  84. $sql = substr($sql, $i + 1);
  85. $i = 0;
  86. $last_char = '';
  87. }
  88. if ($in_string) {
  89. // We are in a string, first check for escaped backslashes
  90. if ($char == '\\') {
  91. if ($last_char != '\\') {
  92. $escaped_backslash = FALSE;
  93. } else {
  94. $escaped_backslash = !$escaped_backslash;
  95. }
  96. }
  97. // then check for not escaped end of strings except for
  98. // backquotes than cannot be escaped
  99. if (($char == $string_start)
  100. && ($char == '`' || !(($last_char == '\\') && !$escaped_backslash))) {
  101. $in_string = FALSE;
  102. $string_start = '';
  103. }
  104. } else {
  105. // we are not in a string, check for start of strings
  106. if (($char == '"') || ($char == '\'') || ($char == '`')) {
  107. $in_string = TRUE;
  108. $string_start = $char;
  109. }
  110. }
  111. $last_char = $char;
  112. } // end for
  113. // add any rest to the returned array
  114. if (!empty($sql)) {
  115. $ret[] = $sql;
  116. }
  117. return $ret;
  118. }
  119. function is_login()
  120. {
  121. return $_SESSION['level'] > 0;
  122. }
  123. function is_admin()
  124. {
  125. return $_SESSION['level'] == 9;
  126. }
  127. function uid()
  128. {
  129. return intval($_SESSION['uid']);
  130. }
  131. function uname()
  132. {
  133. return t($_SESSION['uname']);
  134. }
  135. function forward( $url )
  136. {
  137. header( "Location: " . $url );
  138. }
  139. function jsforword( $url )
  140. {
  141. return '<script>location="' . $url . '"</script>';
  142. }
  143. function image( $filename )
  144. {
  145. return 'static/image/' . $filename;
  146. }
  147. function avatar( $url )
  148. {
  149. if( strlen($url) < 1 ) return c('default_avatar');
  150. else return $url;
  151. }
  152. function ctime( $timeline )
  153. {
  154. $time = strtotime($timeline);
  155. if( time() > ($time+60*60*24*300) )return date( __('DATE_FULL_FORMAT') ,$time);
  156. elseif( time() > ($time+60*60*8) ) return date( __('DATE_SHORT_FORMAT') ,$time);
  157. else return date("H:i:s",$time);
  158. }
  159. /*
  160. function rtime( $timeline )
  161. {
  162. return date("m月d日 H点i分" , strtotime($timeline) );
  163. }
  164. */
  165. function rtime( $time = false, $limit = 86400, $format = null)
  166. {
  167. if( $format === null ) $format = __('DATE_SHORT_FORMAT');
  168. $time = strtotime($time);
  169. $now = time();
  170. $relative = '';
  171. if ($time === $now) $relative = __('DATE_RELATED_NOW');
  172. elseif ($time > $now) $relative = __('DATE_RELATED_AFTER') ;
  173. else
  174. {
  175. $diff = $now - $time;
  176. if ($diff >= $limit) $relative = date($format, $time);
  177. elseif ($diff < 60)
  178. {
  179. $relative = __('DATE_RELATED_LESS_THAN_A_MINUTE');
  180. }
  181. elseif (($minutes = ceil($diff/60)) < 60)
  182. {
  183. if( (int)$minutes === 1 ) $relative = __( 'DATE_RELATED_ONE_MINUTE' );
  184. else $relative = __( 'DATE_RELATED_SOME_MINUTES' , $minutes );
  185. }
  186. else
  187. {
  188. $hours = ceil($diff/3600);
  189. if( (int)$hours === 1 ) $relative = __( 'DATE_RELATED_ONE_HOUR' );
  190. else $relative = __( 'DATE_RELATED_SOME_HOURS' , $hours );
  191. }
  192. }
  193. return $relative;
  194. }
  195. function noname( $content , $name )
  196. {
  197. $len = strlen($name);
  198. if( substr( $content , 0 , $len ) == $name )
  199. return substr( $content , $len );
  200. else
  201. return $content;
  202. }
  203. function render_html( $data , $tpl )
  204. {
  205. ob_start();
  206. extract($data);
  207. require( $tpl );
  208. $content = ob_get_contents();
  209. ob_end_clean();
  210. return $content;
  211. //
  212. }
  213. function read_class( $is_read )
  214. {
  215. if( intval($is_read) == 1 ) return 'read' ;
  216. else return 'unread';
  217. }
  218. function feed_class( $type )
  219. {
  220. switch( $type )
  221. {
  222. case 2:
  223. $class= 'todo';
  224. break;
  225. case 1:
  226. $class= 'notice';
  227. break;
  228. case 3:
  229. $class= 'user';
  230. break;
  231. case 4:
  232. $class= 'cast';
  233. break;
  234. default:
  235. $class = 'normal';
  236. }
  237. return $class;
  238. }
  239. function device( $type )
  240. {
  241. if( strtolower(t($type)) == 'mobile' )
  242. $ret = __('FROM_MOBILE_DEVICE');
  243. else
  244. $ret = __('FROM_WEB_DEVICE');
  245. return $ret;
  246. }
  247. function get_device()
  248. {
  249. if( is_mobile_request()) return 'mobile';
  250. else return 'web';
  251. }
  252. // ========================================
  253. // client functions
  254. // ========================================
  255. function login( $email , $password )
  256. {
  257. $params = array();
  258. $params['email'] = $email;
  259. $params['password'] = $password;
  260. if($content = send_request( 'user_get_token' , $params ))
  261. {
  262. $data = json_decode( $content , 1 );
  263. if( ($data['err_code'] == 0) && is_array( $data['data'] ) )
  264. return $data['data'];
  265. else
  266. return false;
  267. }
  268. return null;
  269. }
  270. function token()
  271. {
  272. return $_SESSION['token'];
  273. }
  274. function send_request( $action , $param , $token = null )
  275. {
  276. require_once( AROOT . 'controller' . DS . 'api.class.php' );
  277. require_once( AROOT . 'model' . DS . 'api.function.php' );
  278. $GLOBALS['API_EMBED_MODE'] = 1;
  279. // local request
  280. $bake_request = $_REQUEST;
  281. $_REQUEST['c'] = 'api';
  282. $GLOBALS['a'] = $_REQUEST['a'] = $action;
  283. if( $token !== null )
  284. $_REQUEST['token'] = $token;
  285. if( (is_array( $param )) && (count($param) > 0) )
  286. foreach( $param as $key => $value )
  287. {
  288. $_REQUEST[$key] = $value ;
  289. }
  290. $api = new apiController();
  291. // magic call
  292. if( method_exists($api, $action) || has_hook('API_'.$action) )
  293. {
  294. $content = $api->$action();
  295. $_REQUEST = $bake_request;
  296. $GLOBALS['a'] = $_REQUEST['a'];
  297. return $content;
  298. //if($data = json_decode( $content , 1 ))
  299. //return json_encode($data['data']);
  300. }
  301. else
  302. {
  303. return 'API_'.$action . ' NOT EXISTS';
  304. }
  305. return null;
  306. // remote request ...........
  307. /*
  308. $url = c('api_server') . '?c=api&a=' . u($action) . '&token=' . u($token) ;
  309. if( (is_array( $param )) && (count($param) > 0) )
  310. foreach( $param as $key => $value )
  311. $url .= '&' . $key . '=' . u( $value );
  312. if($content = file_get_contents( $url ))
  313. return $content;
  314. return $url;
  315. */
  316. }
  317. function find_at( $text )
  318. {
  319. $reg = '/@(\S+?(?:\s|$))/is';
  320. if( preg_match_all( $reg , $text , $out ) )
  321. return $out[1];
  322. else
  323. return false;
  324. }
  325. function jpeg_up( $source , $dest )
  326. {
  327. if( !function_exists('exif_read_data') ) return copy( $source , $dest );
  328. $img_info = @exif_read_data( $source , ANY_TAG );
  329. switch( $img_info['Orientation'] )
  330. {
  331. case 6:
  332. $r = 270;
  333. break;
  334. case 3:
  335. $r = 180;
  336. break;
  337. case 8:
  338. $r = 90;
  339. break;
  340. default:
  341. $r = 0;
  342. }
  343. $img_src = ImageCreateFromJPEG( $source );
  344. $rotate = imagerotate($img_src, $r, 0,true);
  345. ImageJPEG($rotate,$dest);
  346. }
  347. function upload_as_form( $url , $data )
  348. {
  349. @session_write_close();
  350. $ch = curl_init();
  351. curl_setopt($ch, CURLOPT_URL, $url);
  352. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  353. @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
  354. curl_setopt($ch, CURLOPT_POST, true);
  355. curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  356. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  357. $ch = apply_filter( 'UPLOAD_CURL_SETTINGS' , $ch );
  358. $response = curl_exec($ch);
  359. return $response;
  360. }
  361. function pinyin($_string, $_code='utf8')
  362. { //gbk页面可改为gb2312,其他随意填写为utf8
  363. $_datakey = "a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|bin|bing|bo|bu|ca|cai|can|cang|cao|ce|ceng|cha".
  364. "|chai|chan|chang|chao|che|chen|cheng|chi|chong|chou|chu|chuai|chuan|chuang|chui|chun|chuo|ci|cong|cou|cu|".
  365. "cuan|cui|cun|cuo|da|dai|dan|dang|dao|de|deng|di|dian|diao|die|ding|diu|dong|dou|du|duan|dui|dun|duo|e|en|er".
  366. "|fa|fan|fang|fei|fen|feng|fo|fou|fu|ga|gai|gan|gang|gao|ge|gei|gen|geng|gong|gou|gu|gua|guai|guan|guang|gui".
  367. "|gun|guo|ha|hai|han|hang|hao|he|hei|hen|heng|hong|hou|hu|hua|huai|huan|huang|hui|hun|huo|ji|jia|jian|jiang".
  368. "|jiao|jie|jin|jing|jiong|jiu|ju|juan|jue|jun|ka|kai|kan|kang|kao|ke|ken|keng|kong|kou|ku|kua|kuai|kuan|kuang".
  369. "|kui|kun|kuo|la|lai|lan|lang|lao|le|lei|leng|li|lia|lian|liang|liao|lie|lin|ling|liu|long|lou|lu|lv|luan|lue".
  370. "|lun|luo|ma|mai|man|mang|mao|me|mei|men|meng|mi|mian|miao|mie|min|ming|miu|mo|mou|mu|na|nai|nan|nang|nao|ne".
  371. "|nei|nen|neng|ni|nian|niang|niao|nie|nin|ning|niu|nong|nu|nv|nuan|nue|nuo|o|ou|pa|pai|pan|pang|pao|pei|pen".
  372. "|peng|pi|pian|piao|pie|pin|ping|po|pu|qi|qia|qian|qiang|qiao|qie|qin|qing|qiong|qiu|qu|quan|que|qun|ran|rang".
  373. "|rao|re|ren|reng|ri|rong|rou|ru|ruan|rui|run|ruo|sa|sai|san|sang|sao|se|sen|seng|sha|shai|shan|shang|shao|".
  374. "she|shen|sheng|shi|shou|shu|shua|shuai|shuan|shuang|shui|shun|shuo|si|song|sou|su|suan|sui|sun|suo|ta|tai|".
  375. "tan|tang|tao|te|teng|ti|tian|tiao|tie|ting|tong|tou|tu|tuan|tui|tun|tuo|wa|wai|wan|wang|wei|wen|weng|wo|wu".
  376. "|xi|xia|xian|xiang|xiao|xie|xin|xing|xiong|xiu|xu|xuan|xue|xun|ya|yan|yang|yao|ye|yi|yin|ying|yo|yong|you".
  377. "|yu|yuan|yue|yun|za|zai|zan|zang|zao|ze|zei|zen|zeng|zha|zhai|zhan|zhang|zhao|zhe|zhen|zheng|zhi|zhong|".
  378. "zhou|zhu|zhua|zhuai|zhuan|zhuang|zhui|zhun|zhuo|zi|zong|zou|zu|zuan|zui|zun|zuo";
  379. $_datavalue = "-20319|-20317|-20304|-20295|-20292|-20283|-20265|-20257|-20242|-20230|-20051|-20036|-20032|-20026|-20002|-19990".
  380. "|-19986|-19982|-19976|-19805|-19784|-19775|-19774|-19763|-19756|-19751|-19746|-19741|-19739|-19728|-19725".
  381. "|-19715|-19540|-19531|-19525|-19515|-19500|-19484|-19479|-19467|-19289|-19288|-19281|-19275|-19270|-19263".
  382. "|-19261|-19249|-19243|-19242|-19238|-19235|-19227|-19224|-19218|-19212|-19038|-19023|-19018|-19006|-19003".
  383. "|-18996|-18977|-18961|-18952|-18783|-18774|-18773|-18763|-18756|-18741|-18735|-18731|-18722|-18710|-18697".
  384. "|-18696|-18526|-18518|-18501|-18490|-18478|-18463|-18448|-18447|-18446|-18239|-18237|-18231|-18220|-18211".
  385. "|-18201|-18184|-18183|-18181|-18012|-17997|-17988|-17970|-17964|-17961|-17950|-17947|-17931|-17928|-17922".
  386. "|-17759|-17752|-17733|-17730|-17721|-17703|-17701|-17697|-17692|-17683|-17676|-17496|-17487|-17482|-17468".
  387. "|-17454|-17433|-17427|-17417|-17202|-17185|-16983|-16970|-16942|-16915|-16733|-16708|-16706|-16689|-16664".
  388. "|-16657|-16647|-16474|-16470|-16465|-16459|-16452|-16448|-16433|-16429|-16427|-16423|-16419|-16412|-16407".
  389. "|-16403|-16401|-16393|-16220|-16216|-16212|-16205|-16202|-16187|-16180|-16171|-16169|-16158|-16155|-15959".
  390. "|-15958|-15944|-15933|-15920|-15915|-15903|-15889|-15878|-15707|-15701|-15681|-15667|-15661|-15659|-15652".
  391. "|-15640|-15631|-15625|-15454|-15448|-15436|-15435|-15419|-15416|-15408|-15394|-15385|-15377|-15375|-15369".
  392. "|-15363|-15362|-15183|-15180|-15165|-15158|-15153|-15150|-15149|-15144|-15143|-15141|-15140|-15139|-15128".
  393. "|-15121|-15119|-15117|-15110|-15109|-14941|-14937|-14933|-14930|-14929|-14928|-14926|-14922|-14921|-14914".
  394. "|-14908|-14902|-14894|-14889|-14882|-14873|-14871|-14857|-14678|-14674|-14670|-14668|-14663|-14654|-14645".
  395. "|-14630|-14594|-14429|-14407|-14399|-14384|-14379|-14368|-14355|-14353|-14345|-14170|-14159|-14151|-14149".
  396. "|-14145|-14140|-14137|-14135|-14125|-14123|-14122|-14112|-14109|-14099|-14097|-14094|-14092|-14090|-14087".
  397. "|-14083|-13917|-13914|-13910|-13907|-13906|-13905|-13896|-13894|-13878|-13870|-13859|-13847|-13831|-13658".
  398. "|-13611|-13601|-13406|-13404|-13400|-13398|-13395|-13391|-13387|-13383|-13367|-13359|-13356|-13343|-13340".
  399. "|-13329|-13326|-13318|-13147|-13138|-13120|-13107|-13096|-13095|-13091|-13076|-13068|-13063|-13060|-12888".
  400. "|-12875|-12871|-12860|-12858|-12852|-12849|-12838|-12831|-12829|-12812|-12802|-12607|-12597|-12594|-12585".
  401. "|-12556|-12359|-12346|-12320|-12300|-12120|-12099|-12089|-12074|-12067|-12058|-12039|-11867|-11861|-11847".
  402. "|-11831|-11798|-11781|-11604|-11589|-11536|-11358|-11340|-11339|-11324|-11303|-11097|-11077|-11067|-11055".
  403. "|-11052|-11045|-11041|-11038|-11024|-11020|-11019|-11018|-11014|-10838|-10832|-10815|-10800|-10790|-10780".
  404. "|-10764|-10587|-10544|-10533|-10519|-10331|-10329|-10328|-10322|-10315|-10309|-10307|-10296|-10281|-10274".
  405. "|-10270|-10262|-10260|-10256|-10254";
  406. $_tdatakey = explode('|', $_datakey);
  407. $_tdatavalue = explode('|', $_datavalue);
  408. $_data = array_combine($_tdatakey, $_tdatavalue);
  409. arsort($_data);
  410. reset($_data);
  411. if($_code!= 'gb2312') $_string = _u2_utf8_gb($_string);
  412. $_res = '';
  413. for($i=0; $i<strlen($_string); $i++) {
  414. $_p = ord(substr($_string, $i, 1));
  415. if($_p>160) {
  416. $_q = ord(substr($_string, ++$i, 1)); $_p = $_p*256 + $_q - 65536;
  417. }
  418. $_res .= _pinyin($_p, $_data);
  419. }
  420. return preg_replace("/[^a-z0-9]*/", '', $_res);
  421. }
  422. function _pinyin($_num, $_data)
  423. {
  424. if($_num>0 && $_num<160 ){
  425. return chr($_num);
  426. }elseif($_num<-20319 || $_num>-10247){
  427. return '';
  428. }else{
  429. foreach($_data as $k=>$v){ if($v<=$_num) break; }
  430. return $k;
  431. }
  432. }
  433. function _u2_utf8_gb($_c)
  434. {
  435. $_string = '';
  436. if($_c < 0x80){
  437. $_string .= $_c;
  438. }elseif($_c < 0x800) {
  439. $_string .= chr(0xc0 | $_c>>6);
  440. $_string .= chr(0x80 | $_c & 0x3f);
  441. }elseif($_c < 0x10000){
  442. $_string .= chr(0xe0 | $_c>>12);
  443. $_string .= chr(0x80 | $_c>>6 & 0x3f);
  444. $_string .= chr(0x80 | $_c & 0x3f);
  445. }elseif($_c < 0x200000) {
  446. $_string .= chr(0xf0 | $_c>>18);
  447. $_string .= chr(0x80 | $_c>>12 & 0x3f);
  448. $_string .= chr(0x80 | $_c>>6 & 0x3f);
  449. $_string .= chr(0x80 | $_c & 0x3f);
  450. }
  451. return iconv('utf-8', 'gb2312', $_string);
  452. }
  453. // **************************************************************
  454. // * Plugins & hooks
  455. // **************************************************************
  456. function add_filter( $tag , $function_to_add , $priority = 10 , $accepted_args_num = 1 )
  457. {
  458. return add_hook( $tag , $function_to_add , $priority , $accepted_args_num );
  459. }
  460. function add_action( $tag , $function_to_add , $priority = 10 , $accepted_args_num = 1 )
  461. {
  462. return add_hook( $tag , $function_to_add , $priority , $accepted_args_num );
  463. }
  464. function add_hook( $tag , $function_to_add , $priority = 10 , $accepted_args_num = 1 )
  465. {
  466. $tag = strtoupper($tag);
  467. $idx = build_hook_id( $tag , $function_to_add , $priority );
  468. $GLOBALS['TTHOOK'][$tag][$priority][$idx] = array( 'function' => $function_to_add , 'args_num' => $accepted_args_num );
  469. }
  470. function do_action( $tag , $value = null )
  471. {
  472. return apply_hook( $tag , $value );
  473. }
  474. function apply_filter( $tag , $value = null )
  475. {
  476. return apply_hook( $tag , $value );
  477. }
  478. function apply_hook( $tag , $value )
  479. {
  480. $tag = strtoupper($tag);
  481. if( $hooks = has_hook( $tag ) )
  482. {
  483. ksort( $hooks );
  484. $args = func_get_args();
  485. reset( $hooks );
  486. do
  487. {
  488. foreach( (array) current( $hooks ) as $hook )
  489. {
  490. if( !is_null($hook['function']) )
  491. {
  492. $args[1] = $value;
  493. $value = call_user_func_array( $hook['function'] , array_slice($args, 1, (int) $hook['args_num']));
  494. }
  495. }
  496. }while( next( $hooks ) !== false );
  497. }
  498. return $value;
  499. }
  500. function has_hook( $tag , $priority = null )
  501. {
  502. $tag = strtoupper($tag);
  503. if( is_null($priority) ) return isset( $GLOBALS['TTHOOK'][$tag] )? $GLOBALS['TTHOOK'][$tag]:false;
  504. else return isset( $GLOBALS['TTHOOK'][$tag][$priority] )? $GLOBALS['TTHOOK'][$tag][$priority]:false;
  505. }
  506. function remove_hook( $tag , $priority = null )
  507. {
  508. $tag = strtoupper($tag);
  509. if( is_null($priority) ) unset( $GLOBALS['TTHOOK'][$tag] );
  510. else unset( $GLOBALS['TTHOOK'][$tag][$priority] );
  511. }
  512. // This function is based on wordpress
  513. // from https://raw.github.com/WordPress/WordPress/master/wp-includes/plugin.php
  514. // requere php5.2+
  515. function build_hook_id( $tag , $function )
  516. {
  517. if ( is_string($function) )
  518. return $function;
  519. if ( is_object($function) )
  520. {
  521. // Closures are currently implemented as objects
  522. $function = array( $function, '' );
  523. }
  524. else
  525. {
  526. $function = (array) $function;
  527. }
  528. if (is_object($function[0]) )
  529. {
  530. // Object Class Calling
  531. if ( function_exists('spl_object_hash') )
  532. {
  533. return spl_object_hash($function[0]) . $function[1];
  534. }
  535. else
  536. {
  537. return substr( serialize($function[0]) , 0 , 15 ). $function[1];
  538. }
  539. }
  540. elseif( is_string($function[0]) )
  541. {
  542. // Static Calling
  543. return $function[0].$function[1];
  544. }
  545. }
  546. function scan_plugin_info()
  547. {
  548. if( file_exists( c('plugin_path') ) )
  549. foreach( glob( c('plugin_path') . DS . "*" , GLOB_ONLYDIR ) as $pfold )
  550. {
  551. $app_file = $pfold .DS .'app.php';
  552. if( file_exists( $app_file ) )
  553. if($pinfo = get_plugin_info( file_get_contents( $app_file ) ))
  554. $plist[] = $pinfo;
  555. }
  556. return isset( $plist ) ? $plist : false;
  557. }
  558. function get_plugin_info( $content )
  559. {
  560. $reg = '/\*\*\*\s+(.+)\s+\*\*\*/is';
  561. if( preg_match( $reg , $content , $out ) )
  562. {
  563. $info_content = $out[1];
  564. $lines = explode('##',$info_content);
  565. array_shift($lines);
  566. foreach( $lines as $line )
  567. {
  568. $line = trim($line);
  569. list( $key , $value ) = explode( ' ' , $line , 2 );
  570. $ret[$key] = z(t($value));
  571. }
  572. if( isset($ret) )return $ret;
  573. }
  574. return false;
  575. }
  576. function ttpassv2( $password , $salt = '' )
  577. {
  578. return substr( md5(md5( $password ) . 'T!e*a-m^T$o#y' . $salt ) , 0 , 30 );
  579. }
  580. // =================================================
  581. // make mentions
  582. // =================================================
  583. function member_info()
  584. {
  585. if( !isset($GLOBALS['TT_MEMBER_INFO']) )
  586. {
  587. $sql = "SELECT `id` as `uid` , `name` FROM `user` WHERE `level` > 0 AND `is_closed` != 1 ";
  588. if($data = get_data($sql))
  589. {
  590. foreach( $data as $item )
  591. {
  592. $name = trim($item['name']);
  593. $GLOBALS['TT_MEMBER_INFO']['@'.$name] =
  594. '<a href="javascript:void(0);" uid=' . $item['uid'] . ' class="namecard">'. '@'.$name .'</a>';
  595. if(c('at_short_name'))
  596. if( mb_strlen( $name , 'UTF-8' ) == 3 )
  597. $GLOBALS['TT_MEMBER_INFO']['@'.mb_substr($name , 1 , 2 , 'UTF-8' )] =
  598. '<a href="javascript:void(0);" uid=' . $item['uid'] . ' class="namecard">'. '@'.mb_substr($name , 1 , 2 , 'UTF-8' ).'</a>';
  599. }
  600. }
  601. }
  602. return $GLOBALS['TT_MEMBER_INFO'];
  603. }
  604. function link_at( $str )
  605. {
  606. $to_replace = array_keys( member_info() );
  607. $replace_to = array_values( member_info() );
  608. return str_replace( $to_replace , $replace_to , $str );
  609. }
  610. function find_links( $html )
  611. {
  612. $reg = '/(http[s]*:\/\/([-a-zA-Z0-9@:%~#&_=\+\.\?\/]+?))((\s+)|$)/is';
  613. if( preg_match_all( $reg , $html , $out ) )
  614. {
  615. foreach( $out[0] as $item )
  616. {
  617. $ret[] = trim($item);
  618. }
  619. $ret = array_unique($ret);
  620. return $ret;
  621. }
  622. return false;
  623. }
  624. function replace_links( $html )
  625. {
  626. $reg = '/(http[s]*:\/\/([-a-zA-Z0-9@:%~#&_=\+\.\?\/]+?))((\s+)|$)/is';
  627. if( $ret = preg_replace( $reg , "<a href='$1' target='_blank'>$1</a> " , $html ) )
  628. {
  629. return $ret;
  630. }
  631. else return $html;
  632. }
  633. function js_i18n( $array )
  634. {
  635. $ret = array();
  636. foreach( $array as $key => $value )
  637. {
  638. if( strtoupper( substr( $key , 0 , 3 ) ) == 'JS_' )
  639. $ret[$key] = $value;
  640. }
  641. return $ret;
  642. }
  643. function plugin_append_lang( $lang_array )
  644. {
  645. $c = g('i18n');
  646. if( isset( $lang_array[$c] ) )
  647. $GLOBALS['language'][$c]
  648. = array_merge( $GLOBALS['language'][$c] , $lang_array[$c] ) ;
  649. }
  650. function array_remove( $value , $array )
  651. {
  652. return array_diff($array, array($value));
  653. }
  654. function phpmailer_send_mail( $to , $subject , $body , $from , $host , $port , $user , $password )
  655. {
  656. if( !isset( $GLOBALS['LP_MAILER'] ) )
  657. {
  658. include_once( AROOT . 'lib' . DS . 'phpmailer.class.php' );
  659. $GLOBALS['LP_MAILER'] = new PHPMailer();
  660. }
  661. $mail = $GLOBALS['LP_MAILER'];
  662. $mail->CharSet = 'UTF-8';
  663. $mail->Encoding = 'base64';
  664. $mail->IsSMTP();
  665. $mail->Host = $host;
  666. $mail->SMTPAuth = true;
  667. //$mail->SMTPKeepAlive = true;
  668. $mail->Port = $port;
  669. $mail->Username = $user;
  670. $mail->Password = $password;
  671. $mail->SetFrom($from );
  672. $mail->AddReplyTo($from);
  673. $mail->Subject = $subject ;
  674. $mail->WordWrap = 50;
  675. $mail->MsgHTML($body);
  676. $mail->AddAddress( $to );
  677. if(!$mail->Send())
  678. {
  679. $GLOBALS['LP_MAILER_ERROR'] = $mail->ErrorInfo;
  680. //echo $mail->ErrorInfo;
  681. return false;
  682. }
  683. else
  684. {
  685. $mail->ClearAddresses();
  686. return true;
  687. }
  688. }
  689. ?>