huangdong пре 6 година
родитељ
комит
0a9f80884d

+ 1 - 0
data/model/room.model.php

@@ -99,6 +99,7 @@ class roomModel extends Model
     public function getRoomMsg($room_id,$msg_type) {
         return $this->table('room_msg')->field('*')->where(['room_id' => $room_id, 'type' => $msg_type])->order('add_time desc')->select();
     }
+
     public function getRoomsgList($condition, $pagesize = '', $field = '*', $order = 'msg_id desc',$master = false) {
         return $this->table('room_msg')->field($field)->where($condition)->order($order)->limit($pagesize)->master($master)->select();
     }

+ 20 - 2
helper/model/member_info.php

@@ -32,7 +32,6 @@ class member_info
             }
         }
     }
-
     public function member_id()
     {
         return $this->member_id;
@@ -205,7 +204,6 @@ class member_info
     public function invited_bonus() {
         return intval($this->member_info['invited_bonus']) == 1;
     }
-
     static function alpha_compare($left,$right)
     {
         $l = $left['alpha'] == '#'? 91:$left['alpha'];
@@ -223,4 +221,24 @@ class member_info
             return -1;
         }
     }
+
+    public static function get_members($uids)
+    {
+        $members = [];
+        if (empty($uids)) return $members;
+
+        $uids = array_unique($uids);
+        $items = Model('member')->getMemberList(['member_id' => ['in', $uids]]);
+        foreach ($items as $item)
+        {
+            try {
+                $info = new member_info($item);
+                $members[] = $info->filter();
+            } catch (Exception $ex) {
+                Log::record($ex->getMessage(), Log::ERR);
+            }
+        }
+
+        return $members;
+    }
 }

+ 49 - 35
helper/room/base_room.php

@@ -74,23 +74,50 @@ abstract class base_room
     public function usercount() {
         return count($this->mParticipants);
     }
+
     public function kickout($manager,$users)
     {
-        $fadmin = $this->mRoomInfo->isAdmin($manager);
-        if($fadmin == false) return false;
+        $fAdmin = $this->mRoomInfo->isAdmin($manager);
+        if($fAdmin == false) return false;
 
+        $uids = [];
         $kicks = [];
-        foreach ($users as $user)
-        {
-            $fadmin = $this->mRoomInfo->isAdmin($user);
-            if($fadmin) continue;
+        foreach ($users as $user) {
+            $fAdmin = $this->mRoomInfo->isAdmin($user);
+            if($fAdmin || $manager == $user) continue;
 
-            if($this->kick_out($user) != false) {
-                $kicks[] = $user;
-            }
+            $userinfo = $this->find($user);
+            if($userinfo == false) continue;
+
+            $kicks[] = $userinfo;
+            unset($this->mParticipants[$user]);
+            $this->mod_room->kickout($this->room_id(),$user);
+            $uids[] = $user;
+        }
+
+        if(empty($kicks)) {
+            return false;
+        } else {
+            $content = $this->format_kickout($manager,$kicks);
+            $this->relay_broadcast('message',['msgid' => -1,'type' => proto_type::msg_stype_plain,'content' => $content,'send_time' => time()]);
+            return $uids;
         }
+    }
+
+    private function format_kickout($user, $kickinfos)
+    {
+        $user  = $this->userinfos($user);
+        $str = "<font color='#3c78d8'>{$user['nickname']}</font>将:";
+
+        $contents = [];
+        foreach ($kickinfos as $user) {
+            $contents[] = "<font color='#3c78d8'>{$user['nickname']}</font>";
+        }
+
+        $str .= implode(',',$contents);
+        $str .= "移除群聊";
 
-        return $kicks;
+        return $str;
     }
 
     private function format_invite($inviter,$invitees)
@@ -99,12 +126,12 @@ abstract class base_room
         $inviter  = $this->userinfos($inviter);
 
         $str = "<font color='#3c78d8'>{$inviter['nickname']}</font>邀请:";
-        $sinvitees = [];
+        $contents = [];
         foreach ($invitees as $user) {
-            $sinvitees[] = "<font color='#3c78d8'>{$user['nickname']}</font>";
+            $contents[] = "<font color='#3c78d8'>{$user['nickname']}</font>";
         }
-        $str .= implode(',',$sinvitees);
-        $str .= " 加入群聊";
+        $str .= implode(',',$contents);
+        $str .= "加入群聊";
 
         return $str;
     }
@@ -178,17 +205,9 @@ abstract class base_room
         if($ret != false) {
             unset($this->mParticipants[$userid]);
             $this->mod_room->leave($this->room_id(),$userid);
-            return true;
-        } else {
-            return false;
-        }
-    }
-    public function kick_out($userid)
-    {
-        $ret = $this->find($userid);
-        if($ret != false) {
-            unset($this->mParticipants[$userid]);
-            $this->mod_room->kickout($this->room_id(),$userid);
+
+            $content = "<font color='#3c78d8'>{$ret['nickname']}</font>退出群聊";
+            $this->relay_broadcast('message',['msgid' => -1,'type' => proto_type::msg_stype_plain,'content' => $content,'send_time' => time()]);
             return true;
         } else {
             return false;
@@ -330,26 +349,21 @@ abstract class base_room
 
     public function userinfos($users)
     {
-        $result = [];
         if(is_array($users))
         {
+            $result = [];
             foreach ($users as $user)
             {
                 $info = $this->find($user);
                 if($info == false) continue;
-
                 $result[] = $info;
             }
+
+            return $result;
         }
-        else
-        {
-            $info = $this->find($users);
-            if($info != false) {
-                $result[] = $info;
-            }
+        else {
+            return $this->find($users);
         }
-
-        return $result;
     }
 
     protected function times($userid)

+ 21 - 1
helper/room/factory_client.php

@@ -128,6 +128,27 @@ class factory_client extends tcp_client
             return $result['data'];
         }
     }
+    public function kickout($roomid, $user,$kicks)
+    {
+        $users = [];
+        foreach ($kicks as $user) {
+            $uid = intval($user);
+            if($uid > 0) $users[] = $uid;
+        }
+        if(empty($kicks)) return false;
+
+        $param = ["act" => 'fcgi','op' => 'kickout','room' => $roomid,'user' => $user,'kicks' => $users];
+        $result = $this->request($param);
+        if(empty($result)) return false;
+
+        $code = intval($result['code']);
+        if($code != 200) {
+            return false;
+        }
+        else {
+            return $result['data'];
+        }
+    }
     public function change($roomid)
     {
         $param = ["act" => 'fcgi','op' => 'change','room' => $roomid];
@@ -142,7 +163,6 @@ class factory_client extends tcp_client
             return $result['data'];
         }
     }
-
     public function push($content)
     {
         $param = ["act" => 'fcgi','op' => 'push','content' => $content];

+ 37 - 2
helper/room/factory_processor.php

@@ -176,7 +176,7 @@ class factory_processor implements IProcessor
         }
         elseif($op == 'leave')
         {
-            $roomid   = intval($input['room']);
+            $roomid = intval($input['room']);
             $user  = intval($input['user']);
 
             if($roomid <= 0 || $user <= 0) {
@@ -191,7 +191,28 @@ class factory_processor implements IProcessor
             if($ret != false) {
                 return $this->success($ret);
             } else {
-                return $this->error(errcode::ErrRoomInvite);
+                return $this->error(errcode::ErrRoomLeave);
+            }
+        }
+        elseif($op == 'kickout')
+        {
+            $roomid = intval($input['room']);
+            $user   = intval($input['user']);
+            $kicks  = $input['kicks'];
+
+            if($roomid <= 0 || $user <= 0) {
+                return $this->error(errcode::ErrRoomKickout);
+            }
+
+            $client = $this->find_room($roomid,$bufid);
+            if($client == false) {
+                $this->build($roomid);
+            }
+            $ret = $this->kickout($roomid,$user,$kicks);
+            if($ret != false) {
+                return $this->success($ret);
+            } else {
+                return $this->error(errcode::ErrRoomKickout);
             }
         }
         elseif($op == 'push')
@@ -314,6 +335,20 @@ class factory_processor implements IProcessor
             }
         }
     }
+    private function kickout($roomid, $user,$kicks)
+    {
+        foreach ($this->mBufidRooms as $bufid => $client)
+        {
+            if($client->contain_room($roomid))
+            {
+                $this->block($bufid);
+                $ret = $client->kickout($roomid,$user,$kicks);
+                $this->unblock($bufid);
+
+                return $ret;
+            }
+        }
+    }
 
     private function push($content)
     {

+ 15 - 0
helper/room/room_client.php

@@ -148,6 +148,21 @@ class room_client extends tcp_client
             return $result['data'];
         }
     }
+    public function kickout($roomid, $user,$kicks)
+    {
+        $param = ["act" => 'factory','op' => 'leave','room' => $roomid,'user' => $user,'kicks' => $kicks];
+        $result = $this->request($param);
+        if(empty($result)) return false;
+
+        $code = intval($result['code']);
+        if($code != 200) {
+            return false;
+        }
+        else {
+            return $result['data'];
+        }
+    }
+
     public function message($room,$user,$type,$content)
     {
         $param = ["act" => 'room','op' => 'message','room' => $room,'user' => $user,'type' => $type,'content' => $content];

+ 3 - 42
helper/room/room_parts.php

@@ -59,51 +59,12 @@ class room_parts
         return $result;
     }
 
-
-    public static function use_tmp_name($room)
-    {
-        $tmp_name = $room['tmp_name'];
-        $user_cnt = intval($room['users']);
-        //tmp_name can be use already
-        if (!empty($tmp_name)) {
-            $tmp_len = count(explode('、', $tmp_name));
-            if ($tmp_len > 3 || $tmp_len >= $user_cnt) {
-                return $tmp_name;
-            }
-        }
-
-        //create new tmp_name
-        $tmp_name = "";
-        $room_id = intval($room['room_id']);
-        $uids = self::room_uids($room_id, 4);
-        $names = Model('member')->field('member_nickname')->where(["member_id" => ["in", $uids]])->select();
-        foreach ($names as $name) {
-            $tmp_name .= $name['member_nickname'] . '、';
-        }
-        $tmp_name = trim($tmp_name, "、");
-
-        $cond = ["room_id" => $room['room_id']];
-        $update = ["tmp_name" => $tmp_name];
-
-        if (empty($ret)) $ret = '丽人丽妆';
-        $ret = Model("room")->editRoom($cond, $update);
-
-        if ($ret) {
-            return $tmp_name;
-        } else {
-            Log::record("room_name create faild room:" . json_encode($room));
-            return false;
-        }
-    }
-
-    public static function room_uids($roomid, $limit = false)
+    public function allparts()
     {
         $uids = [];
-        $mod_room = Model('room');
-
-        $items = $mod_room->getRoomParts(["room_id" => $roomid, 'state' => 0], 'member_id', $limit);
+        $items = $this->mModRoom->getRoomParts(["room_id" => $this->mRoomID, 'state' => 0], 'member_id', false);
         foreach ($items as $item) {
-            $uids[] = $item['member_id'];
+            $uids[] = intval($item['member_id']);
         }
         return $uids;
     }

+ 31 - 2
helper/room/room_processor.php

@@ -92,6 +92,9 @@ class room_processor implements IProcessor
         elseif($op == 'leave') {
             return $this->factory_leave($input);
         }
+        elseif($op == 'kickout') {
+            return $this->factory_kickout($input);
+        }
         elseif($op == 'push') {
             return $this->factory_push($input);
         }
@@ -155,8 +158,8 @@ class room_processor implements IProcessor
                         $room_info = $room->room_info();
                         $this->broad_access(msg_builder::invite_message($roomid, $room->room_type(), $newusers));
 
-                        $inviter_info = $room->userinfos($inviter);
-                        $this->broad_access(msg_builder::invited_push($roomid, $newusers,$inviter_info[0],$room_info));
+                        $inviter = $room->userinfos($inviter);
+                        $this->broad_access(msg_builder::invited_push($roomid, $newusers,$inviter,$room_info));
                         $this->broadcast_roomsg($room);
 
                         $last_count = $room->usercount() - count($newusers);
@@ -220,6 +223,32 @@ class room_processor implements IProcessor
 
         return $this->error(errcode::ErrRoomLeave);
     }
+
+    private function factory_kickout($input)
+    {
+        $roomid = intval($input['room']);
+        if ($roomid <= 0) {
+            return $this->error(errcode::ErrRoomParam);
+        }
+        $room = $this->room($roomid);
+
+        if ($room != false)
+        {
+            $user =  intval($input['user']);
+            $kicks = $input['kicks'];
+
+            if ($user > 0)
+            {
+                $result = $room->kickout($user,$kicks);
+                if ($result != false) {
+                    $this->broad_access(msg_builder::leave_message($roomid, $room->room_type(), $result));
+                    return $this->success($result);
+                }
+            }
+        }
+
+        return $this->error(errcode::ErrRoomLeave);
+    }
     /**
      * @param $input
      * @return mixed|string

+ 65 - 54
helper/room/util.php

@@ -11,6 +11,9 @@ namespace room;
 use Exception;
 use Log;
 use member_info;
+use errcode;
+use uniquer;
+use relation;
 
 class sorter
 {
@@ -26,8 +29,6 @@ class sorter
         else
             return 0;
     }
-
-
     static public function msgid_asc($left,$right)
     {
         $t_l = intval($left['msg_id']);
@@ -53,6 +54,43 @@ class talks_helper
         $this->mod_room = Model('room');
     }
 
+    public function friends($user)
+    {
+        $relations = $this->relations($user);
+        $invitees = $this->invitees($user);
+        $friends = array_merge($relations,$invitees);
+        $friends[] = $user;
+        $friends = array_unique($friends);
+
+        return $friends;
+    }
+
+    private function relations($user)
+    {
+        try
+        {
+            $relation = new relation\mem_relation($user);
+            $follows = $relation->follower();//我关注的
+            $fans = $relation->subscriber();//关注我的
+
+            return array_merge($follows,$fans);
+        }
+        catch (Exception $ex) {
+            return [];
+        }
+    }
+    private function invitees($user)
+    {
+        $mod_member = Model('member');
+        $items = $mod_member->getMemberList(['inviter_id' => $user],'member_id', 0, '');
+
+        $users = [];
+        foreach ($items as $item) {
+            $users[] = intval($item['member_id']);
+        }
+        return $users;
+    }
+
     public function talks($user,$input)
     {
         $params = $this->talk_params($input);
@@ -60,18 +98,28 @@ class talks_helper
         $room_msgs = $this->lastmsgs($roomids,$room_senders,0);
         $room_list = $this->room_list($roomids,$room_msgs,$params['rooms']);
 
-        $chatid_others = $this->chatwos($user);
+        $chatwo_uniquer = new uniquer();
+        $chatid_others = $this->chatwos($user,$chatwo_uniquer);
         $chatwo_msgs = $this->lastmsgs(array_keys($chatid_others),$chatwo_senders,1);
         $chatwo_list = $this->chatwo_list($chatid_others,$chatwo_msgs,$params['chatwos']);
 
         $talk_list = array_merge($room_list,$chatwo_list);
         usort($talk_list,['room\sorter','msgid_desc']);
 
+        $friends = $this->friends($user);
+        foreach ($friends as $friend)
+        {
+            if(!$chatwo_uniquer->find($friend)) {
+                $talk_list[] = ['talk_type' => 'chatwo','talk_id' => $friend,'count' => 0,'msg_id' => 0];
+            }
+        }
+
         $other = array_values($chatid_others);
-        $uids = array_merge($other,$room_senders,$chatwo_senders);
-        $members   = members::get_members($uids);
+        $uids = array_merge($other,$room_senders,$chatwo_senders,$friends);
+        $uids = array_unique($uids);
+        $members = member_info::get_members($uids);
 
-        return ["talk_list" => $talk_list,"room_descs" => $room_descs,'messages' => array_merge($room_msgs,$chatwo_msgs),"members"=>$members];
+        return ["talk_list" => $talk_list,"room_descs" => $room_descs,'messages' => array_merge($room_msgs,$chatwo_msgs),"members" => $members];
     }
 
     private function talk_params($json)
@@ -100,14 +148,14 @@ class talks_helper
                 $user = intval($item['talk_id']);
                 if($user <= 0) continue;
 
-                $rooms[$user] = $msgid;
+                $chats[$user] = $msgid;
             }
             else {
                 continue;
             }
         }
 
-        return ["rooms"=>$rooms,"chatwos"=>$chats];
+        return ["rooms" => $rooms,"chatwos" => $chats];
     }
 
     private function chatrooms($user, &$roomids)
@@ -148,6 +196,7 @@ class talks_helper
         foreach ($msgs as $key => $item)
         {
             $sender = intval($item['member_id']);
+            $senders[] = $sender;
             $info = [
                 "msg_id" => intval($item['msg_id']),
                 "room_id" => intval($item['room_id']),
@@ -203,7 +252,7 @@ class talks_helper
                 {
                     if(array_key_exists($other,$input))
                     {
-                        if($input[$room] > 0 && $input[$other] < $msgid) {
+                        if($input[$room] >= 0 && $input[$other] < $msgid) {
                             $count = $this->mod_room->getRoomMsgsCount(['room_id' => $room,"msg_id"=>array(['gt',$input[$other]],['elt',$msgid]),"msg_type" => 1]);
                         } else {
                             $count = 0;
@@ -260,7 +309,7 @@ class talks_helper
                 {
                     if(array_key_exists($room,$input))
                     {
-                        if($input[$room] > 0 && $input[$room] < $msgid) {
+                        if($input[$room] >= 0 && $input[$room] < $msgid) {
                             $count = $this->mod_room->getRoomMsgsCount(['room_id' => $room,"msg_id"=>array(['gt',$input[$room]],['elt',$msgid]), "msg_type" => 0]);
                         } else {
                             $count = 0;
@@ -279,7 +328,7 @@ class talks_helper
         }
     }
 
-    private function chatwos($user)
+    private function chatwos($user,uniquer $uniquer)
     {
         $items = $this->mod_room->getChatwoRooms(['user_left' => $user,'user_right' => $user,'_op' => 'OR']);
         if(empty($items)) return [];
@@ -287,10 +336,11 @@ class talks_helper
         $result = [];
         foreach ($items as $item) {
             $id = intval($item['chat_id']);
-
             $left = intval($item['user_left']);
             $right = intval($item['user_right']);
-            $result[$id] = $left == $user ? $right : $left;
+            $friend = $left == $user ? $right : $left;
+            $result[$id] = $friend;
+            $uniquer->add_value($friend);
         }
 
         return $result;
@@ -310,57 +360,18 @@ class talks_helper
     }
 }
 
-class members
-{
-    public static function get_members($uids)
-    {
-        $members = [];
-        if(empty($uids)) return $members;
-
-        $uids = array_unique($uids);
-        $items = Model('member')->getMemberList(['member_id' => ['in',$uids]]);
-        foreach ($items as $item)
-        {
-            try
-            {
-                $info = new member_info($item);
-                $members[] = $info->filter();
-            }
-            catch (Exception $ex) {
-                Log::record($ex->getMessage(),Log::ERR);
-            }
-        }
-
-        return $members;
-    }
-
-    public static function uids_filter($operater,$needle)
-    {
-        $uids = [];
-        foreach ($operater as $value){
-            if($value == $needle){
-                continue;
-            }else{
-                $uids[] = $value;
-            }
-        }
-        return $uids;
-    }
-}
-
 class uploader
 {
     public function upfile($upload_dir,&$upload_info)
     {
         if(empty($upload_dir)) {
-            $upload_info = ['code' => \errcode::ErrUpfile, 'msg' => "目标目录不能为空"];
+            $upload_info = ['code' => errcode::ErrUpfile, 'msg' => "目标目录不能为空"];
             return false;
         }
 
         $roomid = intval($_POST['room_id']);
         $file_path = $this->file_path();
 
-
         $upload = new \FileUploader();
         if($upload->init_files($file_path,$roomid,$upload_info) == false) {
             return false;
@@ -380,7 +391,7 @@ class uploader
             $upload_info = ['code' => 200, 'msg' => $upload->file_name];
             return true;
         } else {
-            $upload_info = ['code' => \errcode::ErrUpfile, 'msg' => $upload->error];
+            $upload_info = ['code' => errcode::ErrUpfile, 'msg' => $upload->error];
             return false;
         }
     }

+ 1 - 1
helper/third_author/wxauthor.php

@@ -70,7 +70,7 @@ class wxauthor
                     'redirect_uri' => $back_url,
                     'response_type' => 'code',
                     'scope' => 'snsapi_userinfo',
-                    'state' => base64_encode(BASE_SITE_URL)];
+                    'state' => urlencode(BASE_SITE_URL)];
         $ref_url = util::http_add_params(self::authorize_url,$params);
         $ref_url .= '#wechat_redirect';
 

+ 113 - 137
mobile/control/member_talk.php

@@ -62,56 +62,31 @@ class member_talkControl extends mbMemberControl
 
     static private function shake_creator($room_id)
     {
-        static $stCreator = 0;
-
-        if($stCreator == 0) {
-            $mod_room = Model('room');
-            $params = $mod_room->getRoom($room_id);
+        $mod_room = Model('room');
+        $params = $mod_room->getRoom($room_id);
+        if (!empty($params)) {
             $rinfo = new room\room_info($params);
-            $stCreator = $rinfo->creator();
-        }
-
-        return $stCreator;
-    }
-
-    private function relations($user)
-    {
-        try
-        {
-            $relation = new relation\mem_relation($user);
-            $follows = $relation->follower();//我关注的
-            $fans = $relation->subscriber();//关注我的
-
-            return array_merge($follows,$fans);
+            return $rinfo->creator();
         }
-        catch (Exception $ex) {
-            return [];
+        else {
+            return false;
         }
     }
 
-    private function invitees($user)
+    public function talksOp()
     {
-        $mod_member = Model('member');
-        $items = $mod_member->getMemberList(['inviter_id' => $user],'member_id', 0, '');
+        $talks_helper = new room\talks_helper();
+        $input = base64_decode($_POST['cmp_table']);
+        $result = $talks_helper->talks(session_helper::memberid(),$input);
 
-        $users = [];
-        foreach ($items as $item) {
-            $users[] = intval($item['member_id']);
-        }
-        return $users;
+        return self::outsuccess($result);
     }
 
     public function friendsOp()
     {
-        $user = session_helper::memberid();
-
-        $relations = $this->relations($user);
-        $invitees = $this->invitees($user);
-        $friends = array_merge($relations,$invitees);
-        $friends[] = $user;
-        $friends = array_unique($friends);
-
-        $members = room\members::get_members($friends);
+        $talks_helper = new room\talks_helper();
+        $friends = $talks_helper->friends(session_helper::memberid());
+        $members = member_info::get_members($friends);
         usort($members,['member_info','alpha_compare']);
 
         $uids = [];
@@ -143,10 +118,8 @@ class member_talkControl extends mbMemberControl
             if($room <= 0) {
                 return self::outerr(errcode::ErrParamter);
             }
-
             $result = $this->roomsg($msgid,$room);
             $msgs = $this->format_message($result['uids'],$result['msgs'],$type,0);
-
         }
         elseif($type == 'chatwo')
         {
@@ -156,18 +129,17 @@ class member_talkControl extends mbMemberControl
             }
             $result = $this->chatwomsg($msgid,$user);
             $msgs = $this->format_message($result['uids'],$result['msgs'],$type,$user);
-
         }
         else {
-
+            $msgs = [];
+            Log::record(__METHOD__ . " : invalid type={$type}.",Log::ERR);
         }
-        return self::outsuccess(["msgs"=>$msgs]);
+        return self::outsuccess(["msgs" => $msgs]);
     }
 
     private function format_message($uids,$msgs,$type,$other)
     {
         $members = [];
-
         if(!empty($uids))
         {
             $items = Model('member')->getMemberList(['member_id' => ['in',$uids]]);
@@ -190,7 +162,6 @@ class member_talkControl extends mbMemberControl
             }
         }
 
-
         $result = [];
         if(!empty($msgs))
         {
@@ -213,7 +184,6 @@ class member_talkControl extends mbMemberControl
                 elseif($type == 'chatwo')
                 {
                     $val['from'] = $from;
-
                     if($from == session_helper::memberid()) {
                         $val['to'] = $other;
                     }
@@ -239,16 +209,13 @@ class member_talkControl extends mbMemberControl
         $mod_room = Model('room');
         $msgs = $mod_room->getRoomsgList(['room_id' => $room,'msg_id' => ['lt',$msgid],'msg_type' => 0], $this->page_size);
 
-
         $uids = [];
         if($msgs)
         {
             usort($msgs,['room\sorter','msgid_asc']);
-
             foreach ($msgs as $msg) {
                 $uids[] = intval($msg['member_id']);
             }
-
             $uids = array_unique($uids);
         }
 
@@ -262,11 +229,10 @@ class member_talkControl extends mbMemberControl
         $right = $user;
 
         $chat_id = $mod_room->findChatid($left,$right);
-
-        if($chat_id == false) return ['uids' => [$left,$right],'msgs' => []];
-
+        if($chat_id == false) {
+            return ['uids' => [$left,$right],'msgs' => []];
+        }
         $msgs = $mod_room->getRoomsgList(['room_id' => $chat_id,'msg_id' => ['lt',$msgid],'msg_type' => 1], $this->page_size);
-
         if($msgs){
             usort($msgs,['room\sorter','msgid_asc']);
         }
@@ -278,7 +244,9 @@ class member_talkControl extends mbMemberControl
     {
         $creator = session_helper::memberid();
         $result = room\factory_client::instance()->create_chat($creator);
-        if($result == false) return self::outerr(errcode::ErrRoom,"建群失败");
+        if($result == false) {
+            return self::outerr(errcode::ErrRoom,"建群失败");
+        }
 
         $room = $result['room'];
         if(!empty($_GET['invitees']))
@@ -289,11 +257,12 @@ class member_talkControl extends mbMemberControl
                 $ret = room\factory_client::instance()->invite($room,$creator,$invitees);
                 if($ret == false) return self::outerr(errcode::ErrRoom,"邀请失败");
 
-                return self::outsuccess(["room_id"=>$room,"room_name"=>"群聊(".(count($invitees)+1).")"]);
+                return self::outsuccess(["room_id"=>$room,"room_name" => "群聊(".(count($invitees)+1).")"]);
             }else {
                 return self::outerr(errcode::ErrRoom,"建群失败");
             }
-        }else {
+        }
+        else {
             return self::outsuccess(["room_id"=>$room,"room_name"=>"群聊"]);
         }
     }
@@ -312,7 +281,7 @@ class member_talkControl extends mbMemberControl
         }
         else
         {
-            $members = room\members::get_members($result['newusers']);
+            $members = member_info::get_members($result['newusers']);
             $result['invitees'] = $members;
             return self::outsuccess($result);
         }
@@ -335,15 +304,36 @@ class member_talkControl extends mbMemberControl
             return self::outsuccess($result);
         }
     }
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    public function talksOp()
+
+    public function kickoutOp()
     {
-        $talks_helper = new room\talks_helper();
-        $input = base64_decode($_POST['cmp_table']);
-        $result = $talks_helper->talks(session_helper::memberid(),$input);
+        $room = intval($_GET['room_id']);
+        $kicks = explode(',', trim($_GET['users']));
 
-        return self::outsuccess($result);
+        if($room <= 0 || count($kicks) <= 0 ) {
+            return self::outerr(errcode::ErrParamter);
+        }
+
+        $item = Model('room')->getRoom($room);
+        if(empty($item)) {
+            return self::outerr(errcode::ErrParamter,"此群不存在");
+        }
+
+        $info = new room\room_info($item);
+        if($info->owner() != session_helper::memberid()) {
+            return self::outerr(errcode::ErrTalk,"只有群主可以踢人");
+        }
+
+        $result = room\factory_client::instance()->kickout($room,session_helper::memberid(),$kicks);
+        if($result === false) {
+            return self::outerr(errcode::ErrRoom);
+        }
+        else {
+            return self::outsuccess($result);
+        }
     }
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     public function room_detailOp()
@@ -399,14 +389,19 @@ class member_talkControl extends mbMemberControl
             return self::outerr(errcode::ErrParamter);
         }
 
-        $cond = ['room_id'=>$room_id];
-        $update = $this->room_edit_data();
-        if(empty($update)) {
-            return self::outerr(errcode::ErrParamter);
+        $updata = [];
+        if(!empty($_GET['room_name'])){
+            $updata["room_name"] = $_GET['room_name'];
+        }
+        if(!empty($_GET['room_desc'])){
+            $updata["room_desc"] = $_GET['room_desc'];
         }
 
-        $ret = Model('room')->editRoom($cond,$update);
+        if(empty($updata)) {
+            return self::outerr(errcode::ErrParamter);
+        }
 
+        $ret = Model('room')->editRoom(['room_id'=>$room_id],$updata);
         if($ret) {
             return self::outsuccess(null);
         } else {
@@ -414,24 +409,25 @@ class member_talkControl extends mbMemberControl
         }
     }
 
-    private function room_edit_data()
+    public function room_usersOp()
     {
-        $update = [];
-
-        $name = trim($_GET['room_name']);
-        if(!empty($name)){
-            $update["room_name"] = $name;
+        $room_id = intval($_GET['room_id']);
+        if($room_id <= 0) {
+            return self::outerr(errcode::ErrParamter);
         }
 
-        $desc = trim($_GET['room_desc']);
-        if(!empty($desc)){
-            $update["room_desc"] = $desc;
-        }
+        $parts = new room\room_parts($room_id);
+        $uids = $parts->allparts();
+        $members = member_info::get_members($uids);
 
-        return $update;
+        return self::outsuccess([
+            'friends' => $uids,
+            'count' => count($uids),
+            "mem_desc" => $members,
+            'mobile_page' => mobile_page(1)]);
     }
 
-    public function member_nickOp()
+    public function change_membernickOp()
     {
         //自己修改
         $roomid = intval($_GET['room_id']);
@@ -474,31 +470,12 @@ class member_talkControl extends mbMemberControl
         }
     }
 
-    public function room_usersOp()
-    {
-        $room_id = intval($_GET['room_id']);
-        if($room_id<=0) return self::outerr(errcode::ErrParamter);
-
-        $self = session_helper::memberid();
-        $items = room\room_helper::room_uids($room_id);
-        if(empty($items)) return self::outerr(errcode::ErrTalk);
-
-        $uids = room\members::uids_filter($items,$self);
-        $members = room\members::get_members($uids);
-
-        return self::outsuccess([
-                'friends' => $uids,
-                'count' => count($uids),
-                "mem_desc" => $members,
-                'mobile_page' => mobile_page(1)]);
-    }
-
-    public function room_avatarOp()
+    public function change_room_avatarOp()
     {
         $roomid = intval($_POST['room_id']);
         $upload_dir =  ATTACH_AVATAR.DS. "room_{$roomid}" . DS;
 
-        $uploader = new \room\uploader();
+        $uploader = new room\uploader();
         $res = $uploader->upfile($upload_dir,$info);
         if($res == false) {
             return self::outerr(errcode::ErrUploadFileFailed);
@@ -515,38 +492,7 @@ class member_talkControl extends mbMemberControl
         }
     }
 
-    public function kickoutOp()
-    {
-        $room = intval($_GET['room_id']);
-        $leavers = explode(',', trim($_GET['troublemaker']));
-        $leavers = $leavers[0];
-
-        if($room <= 0 || count($leavers) <= 0 ) {
-            return self::outerr(errcode::ErrParamter);
-        }
-
-        $item = Model('room')->getRoom($room);
-        if(empty($item)) {
-            return self::outerr(errcode::ErrParamter);
-        }
-
-        $room_owner = intval(session_helper::memberid());
-        $info = new room\room_info($item);
-        if($info->owner() != $room_owner) {
-            return self::outerr(errcode::ErrTalk,"只有群主可以踢人");
-        }
-
-        $result = room\factory_client::instance()->leave($room,$leavers);
-        if($result === false) {
-            return self::outerr(errcode::ErrRoom);
-        }
-        else {
-            return self::outsuccess($result);
-        }
-    }
-
-
-    public function change_ownerOp()
+    public function change_room_ownerOp()
     {
         $room_id = intval($_GET['room_id']);
         $to_user = explode(',', trim($_GET['room_owner']));
@@ -569,7 +515,6 @@ class member_talkControl extends mbMemberControl
         $info   = $member->filter();
         $name   = $info['nickname'];
 
-        ////
         $trans = new trans_wapper(null,__METHOD__);
 
         $exchange = $this->exchage_room_owner($room_id,$from_user,$to_user);
@@ -585,7 +530,6 @@ class member_talkControl extends mbMemberControl
         ///
     }
 
-
     private function exchage_room_owner($room_id,$from_user,$to_user)
     {
         $mod_room = Model("room");
@@ -596,7 +540,39 @@ class member_talkControl extends mbMemberControl
         return $update1 && $update2;
     }
 
-    //////////////////////////////////////////////////////////////////////////////////////
+    public function change_room_noticeOp()
+    {
+        $roomid = intval($_GET['room_id']);
+        if($roomid <= 0) {
+            return self::outerr(errcode::ErrParamter);
+        }
+
+        $room_notice = trim($_GET['room_notice']);
+        $len = strlen($room_notice);
+        if( $len <= 0 || $len > 450 ) {
+            return self::outerr(errcode::ErrParamter,"公告过长或为空");
+        }
+
+        $mod_room = Model('room');
+        $item = $mod_room->getRoom($roomid);
+        if(empty($item)) {
+            return self::outerr(errcode::ErrParamter,"错误的群信息");
+        }
+
+        $user = session_helper::memberid();
+        $info = new room\room_info($item);
+        if($info->owner() != $user) {
+            return self::outerr(errcode::ErrTalk,"只有管理员可以修改群公告");
+        }
+
+        $ret = Model("room")->editRoom(['room_id' => $roomid],['notice' => $room_notice]);
+        if($ret) {
+            return self::outsuccess(null);
+        } else {
+            return self::outerr(errcode::ErrDB);
+        }
+    }
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     public function friend_detailOp()
     {
         $userid = intval($_GET['userid']);

+ 28 - 28
mobile/templates/default/talk/homepage_room.php

@@ -145,7 +145,7 @@
 
 
             var update_room_avatar = function (room_avatar) {
-                $.post('/mobile/index.php?act=member_talk&op=room_avatar',
+                $.post('/mobile/index.php?act=member_talk&op=change_room_avatar',
                     {
                         room_id: talk_id,
                         file_path: room_avatar,
@@ -245,24 +245,24 @@
                     if (datas.friends.length <= 0 || datas.friends == null) return;
                     var del_friends = datas.friends.join(',');
                     $.showLoading();
-                    $.get('/mobile/index.php?act=member_talk&op=kickout',
-                        {
-                            troublemaker: del_friends,
-                            room_id: talk_id,
-                            client_type: 'ajax'
-                        }, function (res) {
-                            $.hideLoading();
-                            var result = JSON.parse(res);
-                            if (result.code != 200) {
-                                $.alert(result.message);
-                                return;
-                            }
 
-                            for (var i = 0; i < datas.friends.length; i++) {
-                                $('div[data-member-id=' + datas.friends[i] + ']').remove();
-                            }
-                            $.toast('删除成功');
-                        });
+                    $.get('/mobile/index.php?act=member_talk&op=kickout', {
+                        users: del_friends,
+                        room_id: talk_id,
+                        client_type: 'ajax'
+                    }, function (res) {
+                        $.hideLoading();
+                        var result = JSON.parse(res);
+                        if (result.code != 200) {
+                            $.alert(result.message);
+                            return;
+                        }
+
+                        for (var i = 0; i < datas.friends.length; i++) {
+                            $('div[data-member-id=' + datas.friends[i] + ']').remove();
+                        }
+                        $.toast('删除成功');
+                    });
                 });
             });
 
@@ -280,7 +280,7 @@
                     if (datas.friends.length <= 0 || datas.friends == null) return;
                     var new_owner = datas.friends.join(',');
                     $.showLoading();
-                    $.get('/mobile/index.php?act=member_talk&op=change_owner',
+                    $.get('/mobile/index.php?act=member_talk&op=change_room_owner',
                         {
                             room_owner:new_owner,
                             room_id: talk_id,
@@ -403,7 +403,7 @@
                         if (input && input.trim().length <= 15) {
                             //点击确认
                             $.showLoading();
-                            $.get('/mobile/index.php?act=member_talk&op=member_nick',
+                            $.get('/mobile/index.php?act=member_talk&op=change_membernick',
                                 {
                                     member_nick: input,
                                     room_id: talk_id,
@@ -434,16 +434,16 @@
 
         $('#edit_room_notice').on('click',function(){
             $.prompt({
-                title: '修改我的昵称',
-                input: '请输入您的昵称(不得超过15字)',
+                title: '修改群公告',
+                input: '请输入公告信息',
                 empty: false, // 是否允许为空
                 onOK: function (input) {
-                    if (input && input.trim().length <= 15) {
+                    if (input && input.trim().length <= 120) {
                         //点击确认
                         $.showLoading();
-                        $.get('/mobile/index.php?act=member_talk&op=member_nick',
+                        $.get('/mobile/index.php?act=member_talk&op=change_room_notice',
                             {
-                                member_nick: input,
+                                room_notice: input,
                                 room_id: talk_id,
                                 client_type: 'ajax'
                             }, function (res) {
@@ -453,13 +453,13 @@
                                     $.alert(result.message);
                                     return;
                                 }
-                                var new_group_name = input.trim();
-                                $('#edit_nickname .weui-cell__ft').text(new_group_name);
+                                var new_notice = input.trim();
+                                // $('#edit_nickname .weui-cell__ft').text(new_group_name);
                                 $.toast('修改成功');
                             });
                     }
                     else {
-                        $.alert('群名称不得超过15字');
+                        $.alert('群公告不得超过120字');
                     }
 
                 },

+ 1 - 0
mobile/util/errcode.php

@@ -98,6 +98,7 @@ class errcode extends SplEnum
     const ErrRoomAccessOp  = 18007;
     const ErrRoomPush  = 18008;
     const ErrRoomChange = 18009;
+    const ErrRoomKickout = 18010;
 
     const ErrAccess = 19000;
     const ErrTalk = 20000;

+ 1 - 2
mobile/wxauthor.php

@@ -17,7 +17,6 @@ $state = $_GET['state'];
 
 Log::record("state:{$state} originurl=" . wechat_helper::get_origin_url(),Log::DEBUG);
 
-
 if(empty($code)) {
     Log::record("没有同意授权");
 }
@@ -58,7 +57,7 @@ else
     }
     else
     {
-        $host = base64_decode($state);
+        $host = urldecode($state);
         $url = "{$host}/mobile/wxauthor.php?code={$code}";
         Log::record("redirect url={$url}",Log::DEBUG);
         $html = "<!DOCTYPE html>

+ 5 - 0
test/TestStat.php

@@ -69,4 +69,9 @@ class TestStat extends PHPUnit_Framework_TestCase
         $x = "3.1.7";
         $y = intval($x * 100 + 0.5);
     }
+    public function testDecode()
+    {
+        $x = 'aHR0cDovLzE5Mi4xNjguMC4yMDA=';
+        $y = base64_decode($x);
+    }
 }