基于Redis的PHP聊天室程序

  1. <?php
  2. define(‘DISABLE_REFRESH_LIMIT’, 1);
  3. require_once(‘global.php’);
  4. header(‘Content-Type: text/html; charset=UTF-8’);
  5. $redis = new Redis();
  6. $redis->connect(‘127.0.0.1’,6379);
  7. $if_init = get_string(‘chat_init’);
  8. if(!$if_init)
  9. {
  10.     if(get_string(‘chat_init_lock’)){die;}
  11.     set_string(‘chat_init_lock’‘1’);
  12.     set_array(‘chat_channel’array(‘GLOBAL’));
  13.     set_array(‘chat_motd’array(‘GLOBAL’ => ‘Hello!’));
  14.     set_array(‘chat_online’array());
  15.     set_string(‘chat_init’‘1’);
  16.     set_string(“0_name”‘系统’);
  17.     set_string(“0_flag”‘SA’);
  18. }
  19. if(!$winduid){
  20.     echo ‘chatLogin();’;
  21.     die;
  22. }
  23. set_string(“{$winduid}_name”$windid);
  24. set_string(“uid_{$windid}”$winduid);
  25. $channel_list = get_array(‘chat_channel’);
  26. $channel_motd = get_array(‘chat_motd’);
  27. $my_channel = get_string(“{$winduid}_in”);
  28. $my_index = get_string(“{$winduid}_index”);
  29. if(!$my_channel || !in_array($my_channel$channel_list)){
  30.     $my_channel = $channel_list[0];
  31.     set_string(“{$winduid}_in”$my_channel);
  32.     $my_index = 0;
  33. }
  34. $channel_index = get_string(“{$my_channel}_index”);
  35. $channel_ca = get_array(“{$my_channel}_ca”);
  36. if ($winddb[‘groupid’] == 3 || $winddb[‘groupid’] == 4 || $winddb[‘groupid’] == 22)
  37. {
  38.     $user_flag = ‘SA’;
  39. }
  40. else if(in_array($winduid$channel_ca))
  41. {
  42.     $user_flag = ‘CA’;
  43. }
  44. else
  45. {
  46.     $user_flag = ‘U’;
  47. }
  48. set_string(“{$winduid}_flag”$user_flag);
  49. InitGP(array(‘action’‘first’));
  50. if(!$my_index || $first){
  51.     if ($my_index == 0)
  52.     {
  53.         send_message(0, ‘MOTD: ‘ . $channel_motd[$my_channel], ‘info’$my_channel$winduid);
  54.     }
  55.     $my_index = $first ? ($channel_index – 10) : ($channel_index + 1);
  56.     if($my_index < 0){
  57.         $my_index = 0;
  58.     }
  59.     set_string(“{$winduid}_index”$my_index);
  60. }
  61. if($action == ‘ui’)
  62. {
  63.     require_once PrintEot(‘chat_ui’);
  64. }
  65. if($action == ‘channel’)
  66. {
  67.     echo “chatChannelListBegin();\r\n”;
  68.     foreach($channel_list as $channel_name)
  69.     {
  70.         echo “chatHandleChannelList(‘” . mb_convert_encoding($channel_name, ‘UTF-8‘, ‘GBK‘) . “‘);\r\n”;
  71.     }
  72.     echo “chatChannelListEnd();\r\n”;
  73. }
  74. if($action == ‘send’)
  75. {
  76.     InitGP(array(‘content’‘receiver’));
  77.     if (!$content || !$receiver)
  78.     {
  79.         echo ‘0’;
  80.         die;
  81.     }
  82.     if ($winddb[‘postnum’] < 100)
  83.     {
  84.         send_message(0, ‘您的发贴数不足100,没有发言权限’‘warn’$my_channel$winduid);
  85.     }
  86.     else
  87.     {
  88.         if (get_string(“{$winduid}_block”) > $timestamp)
  89.         {
  90.             send_message(0, ‘您已被禁言,无法发言’‘warn’$my_channel$winduid);
  91.         }
  92.         else
  93.         {
  94.             $content = htmlspecialchars($content);
  95.             send_message($winduidstripslashes(mb_convert_encoding($content‘GBK’‘UTF-8’)), ‘info’$my_channel$receiver);
  96.         }
  97.     }
  98.     echo ‘0’;
  99. }
  100. if($action == ‘get’)
  101. {
  102.     $channel_ca_list = ;
  103.     if ($user_flag == ‘SA’ || $user_flag == ‘CA’)
  104.     {
  105.         foreach ($channel_ca as $ca)
  106.         {
  107.             $channel_ca_list .= get_string(“{$ca}_name”) . ‘,’;
  108.         }
  109.         $channel_ca_list = mb_convert_encoding($channel_ca_list‘UTF-8’‘GBK’);
  110.     }
  111.     echo “chatHandleStatus(‘” . mb_convert_encoding($my_channel, ‘UTF-8‘, ‘GBK‘) . “‘‘” . mb_convert_encoding($windid, ‘UTF-8‘, ‘GBK‘) . “‘‘{$user_flag}’‘{$channel_ca_list}’);”;
  112.     for(; $my_index <= $channel_index$my_index ++)
  113.     {
  114.         $message = get_array(“{$my_channel}_{$my_index}”);
  115.         if ($message[‘receiver’] == ‘all’ || $message[‘receiver’] == $winduid)
  116.         {
  117.             $message[‘content’] = addslashes(mb_convert_encoding($message[‘content’], ‘UTF-8’‘GBK’));
  118.             $sender_flag = get_string(“{$message[author]}_flag”);
  119.             $sender_flag == ‘SA’ && $message[‘content’] = ‘<span style=”color:red;font-weight:bold”>’ . $message[‘content’] . ‘</span>’;
  120.             $sender_flag == ‘CA’ && $message[‘content’] = ‘<span style=”color:blue”>’ . $message[‘content’] . ‘</span>’;
  121.             $message[‘author’] = addslashes(mb_convert_encoding(get_string(“{$message[author]}_name”), ‘UTF-8’‘GBK’));
  122.             echo “chatHandleMessage(‘{$message[type]}’, ‘” . $message[‘author‘] . “‘‘{$message[content]}’, {$message[date]});\r\n”;
  123.         }
  124.     }
  125.     set_string(“{$winduid}_index”$my_index);
  126. }
  127. if($action == ‘block’)
  128. {
  129.     InitGP(array(‘username’‘timespan’));
  130.     $username = mb_convert_encoding($username‘GBK’‘UTF-8’);
  131.     if ($user_flag == ‘SA’ || $user_flag == ‘CA’)
  132.     {
  133.         set_string(get_string(“uid_{$username}”) . ‘_block’$timestamp + $timespan * 3600);
  134.         send_message(0, ‘禁言用户[‘ . $username . ‘]成功’‘warn’$my_channel$winduid);
  135.         echo ‘0’;
  136.     }
  137.     else
  138.     {
  139.         send_message(0, ‘权限不足’‘warn’$my_channel$winduid);
  140.         echo ‘-1’;
  141.     }
  142. }
  143. if($action == ‘setchannel’)
  144. {
  145.     InitGP(array(‘option’‘channel’‘channel_name’‘channel_ca’));
  146.     if ($option == ‘join’)
  147.     {
  148.         $channel = mb_convert_encoding($channel‘GBK’‘UTF-8’);
  149.         if (in_array($channel$channel_list))
  150.         {
  151.             set_string(“{$winduid}_index”, 0);
  152.             set_string(“{$winduid}_in”$channel);
  153.             echo ‘0’;
  154.         }
  155.         else
  156.         {
  157.             send_message(0, ‘频道不存在’‘warn’$my_channel$winduid);
  158.             echo ‘-1’;
  159.             die;
  160.         }
  161.     }
  162.     else
  163.     {
  164.         if ($user_flag != ‘SA’)
  165.         {
  166.             send_message(0, ‘目前只有全局管理员可以创建频道’‘warn’$my_channel$winduid);
  167.             echo ‘-1’;
  168.             die;
  169.         }
  170.         if (!$channel_name)
  171.         {
  172.             send_message(0, ‘请输入频道名’‘warn’$my_channel$winduid);
  173.             echo ‘-1’;
  174.             die;
  175.         }
  176.         $channel_name = mb_convert_encoding($channel_name‘GBK’‘UTF-8’);
  177.         $channel_ca = mb_convert_encoding($channel_ca‘GBK’‘UTF-8’);
  178.         if (in_array($channel$channel_list))
  179.         {
  180.             send_message(0, ‘频道名重复’‘warn’$my_channel$winduid);
  181.             echo ‘-1’;
  182.             die;
  183.         }
  184.         $channel_list[] = $channel_name;
  185.         $channel_motd[$channel_name] = ‘Hello!’;
  186.         set_array(‘chat_channel’$channel_list);
  187.         set_array(‘chat_motd’$channel_motd);
  188.         set_array(“{$channel_name}_ca”explode(‘,’$channel_ca));
  189.         send_message(0, ‘频道创建成功’‘warn’$my_channel$winduid);
  190.     }
  191. }
  192. if($action == ‘setmotd’)
  193. {
  194.     InitGP(array(‘motd’));
  195.     $motd = mb_convert_encoding($motd‘GBK’‘UTF-8’);
  196.     if ($user_flag == ‘SA’ || $user_flag == ‘CA’)
  197.     {
  198.         $channel_motd[$my_channel] = $motd;
  199.         set_array(‘chat_motd’$channel_motd);
  200.         send_message(0, ‘MOTD设置成功’‘warn’$my_channel$winduid);
  201.         echo ‘0’;
  202.     }
  203.     else
  204.     {
  205.         send_message(0, ‘权限不足’‘warn’$my_channel$winduid);
  206.         echo ‘-1’;
  207.     }
  208. }
  209. if($action == ‘delchannel’)
  210. {
  211.     if ($user_flag == ‘SA’ || $user_flag == ‘CA’)
  212.     {
  213.         unset($channel_list[array_search($my_channel$channel_list)]);
  214.         unset($channel_motd[$my_channel]);
  215.         set_array(‘chat_channel’$channel_list);
  216.         set_array(‘chat_motd’$channel_motd);
  217.         remove(“{$my_channel}_ca”);
  218.         set_string(“{$winduid}_index”, 0);
  219.         set_string(“{$winduid}_in”‘GLOBAL’);
  220.         send_message(0, ‘频道删除成功’‘warn’‘GLOBAL’$winduid);
  221.         echo ‘0’;
  222.     }
  223.     else
  224.     {
  225.         send_message(0, ‘权限不足’‘warn’$my_channel$winduid);
  226.         echo ‘-1’;
  227.     }
  228. }
  229. if($action == ‘setca’)
  230. {
  231.     InitGP(array(‘username’‘option’));
  232.     if ($user_flag == ‘SA’ || $user_flag == ‘CA’)
  233.     {
  234.         $username = mb_convert_encoding($username‘GBK’‘UTF-8’);
  235.         $uid = get_string(“uid_{$username}”);
  236.         if (!$uid)
  237.         {
  238.             send_message(0, ‘用户没有登录’‘warn’$my_channel$winduid);
  239.             echo ‘-1’;
  240.             die;
  241.         }
  242.         if ($option == ‘add’)
  243.         {
  244.             if (!in_array($uid$channel_ca))
  245.             {
  246.                 $channel_ca[] = $uid;
  247.                 send_message(0, ‘增加管理员[‘ . $username . ‘]’‘warn’$my_channel$winduid);
  248.             }
  249.         }
  250.         else
  251.         {
  252.             if (in_array($uid$channel_ca))
  253.             {
  254.                 unset($channel_ca[array_search($uid$channel_ca)]);
  255.                 send_message(0, ‘取消管理员[‘ . $username . ‘]’‘warn’$my_channel$winduid);
  256.             }
  257.         }
  258.         set_array(“{$my_channel}_ca”$channel_ca);
  259.         echo ‘0’;
  260.     }
  261.     else
  262.     {
  263.         send_message(0, ‘权限不足’‘warn’$my_channel$winduid);
  264.         echo ‘-1’;
  265.     }
  266. }
  267. function remove()
  268. {
  269.     global $redis;
  270.     $redis->delete($name);
  271. }
  272. function set_string($name$val)
  273. {
  274.     global $redis;
  275.     $redis->set($name$val);
  276. }
  277. function get_string($name$val)
  278. {
  279.     global $redis;
  280.     return $redis->get($name);
  281. }
  282. function append_string($name$val)
  283. {
  284.     global $redis;
  285.     return $redis->append($name$val);
  286. }
  287. function set_array($name$val)
  288. {
  289.     global $redis;
  290.     $redis->set($name, serialize($val));
  291. }
  292. function get_array($name)
  293. {
  294.     global $redis;
  295.     return unserialize($redis->get($name));
  296. }
  297. function send_message($author$content$type = ‘info’$channel = ‘GLOBAL’$receiver = ‘all’)
  298. {
  299.     global $redis$timestamp;
  300.     if (strlen($content) > 200)
  301.     {
  302.         $content = substr($content, 0 , 200);
  303.     }
  304.     while(get_string(“{$channel}_lock”)){usleep(100);}
  305.     set_string(“{$channel}_lock”, 1);
  306.     $channel_index = get_string(“{$channel}_index”);
  307.     $channel_index = $channel_index + 1;
  308.     set_array(“{$channel}_{$channel_index}”array(
  309.         ‘author’ => $author,
  310.         ‘content’ => $content,
  311.         ‘type’ => $type,
  312.         ‘receiver’ => $receiver,
  313.         ‘date’ => $timestamp
  314.     ));
  315.     set_string(“{$channel}_index”$channel_index);
  316.     $clean_index = $channel_index – 100;
  317.     remove(“{$channel}_{$clean_index}”);
  318.     $author_name = get_string(“{$author}_name”);
  319.     append_string(“{$channel}_record”, get_date($timestamp‘Y-m-d H:i:s’) . ” [{$type}] {$author_name} -> {$receiver}: {$content}\r\n”);
  320.     check_channel_record($channel);
  321.     set_string(“{$channel}_lock”, 0);
  322. }
  323. function check_channel_record($channel)
  324. {
  325.     global $timestamp;
  326.     $lastsave = get_string(“{$channel}_lastsave”);
  327.     if($timestamp – $lastsave > 600)
  328.     {
  329.         set_string(“{$channel}_lastsave”$timestamp);
  330.         save_record($channel);
  331.     }
  332. }
  333. function save_record($channel)
  334. {
  335.     global $db$timestamp;
  336.     $record = str_replace(
  337.         array(“\\”, “\“”“‘”),
  338.         array(“\\\\”, “\\\“”“\\'”),
  339.         get_string(“{$channel}_record”)
  340.     );
  341.     set_string(“{$channel}_record”);
  342.     if(strlen($record)>0){
  343.         $db->update(“INSERT INTO `pw_chatrecord` (`channel`, `time`, `content`) VALUES (‘$channel’, ‘$timestamp’, ‘$record’)”);
  344.     }
  345. }
0 Comments
Leave a Reply