瀏覽代碼

add to local

stanley-king 6 年之前
父節點
當前提交
13404bd9dc

+ 12 - 8
data/model/room.model.php

@@ -23,19 +23,21 @@ class roomModel extends Model
 
     public function participants($room_id)
     {
-        return $this->table('room_participant')->field('*')->where(['room_id' => $room_id])->limit(false)->select();
+        return $this->table('room_participant')->field('*')->where(['room_id' => $room_id,'state' => 0])->limit(false)->select();
     }
 
-    public function invite($room_id,$user,$room_key)
+    public function invite($room_id,$user,$inviter)
     {
-        $ret = $this->table('room_participant')->insert(['room_id' => $room_id,'member_id' => $user,
-            'room_key' => $room_key,'invite_time' => time(),'join_time' => 0,'jointimes' => 0,'state' => 0]);
-        if($ret == false)
-        {
-            $ret = $this->table('room_participant')->where(['room_id' => $room_id,'member_id' => $user])->update(['room_key' => $room_key,'invite_time' => time(),'join_time' => 0,'jointimes' => 0,'state' => 0]);
-        }
+        $ret = $this->table('room_participant')->insert(['room_id' => $room_id,'member_id' => $user,'inviter' => $inviter,'invite_time' => time(),'join_time' => 0,'jointimes' => 0,'state' => 0],true);
         return $ret;
     }
+
+    public function leave($room_id,$user)
+    {
+        $ret = $this->table('room_participant')->where(['room_id' => $room_id,'member_id' => $user])->update(['leave_time' => time(),'state' => 1]);
+        return $ret;
+    }
+
     public function getRoom($roomid)
     {
         return $this->table('room')->field('*')->where(['room_id' => $roomid])->limit(1)->find();
@@ -67,11 +69,13 @@ class roomModel extends Model
         $item = $this->table('room_extend')->field('*')->where(['userid' => $userid])->lock($lock)->find();
         return $item;
     }
+
     public function addExtend($userid,$datas)
     {
         $datas['userid'] = $userid;
         return $this->table('room_extend')->insert($datas);
     }
+
     public function editExtend($userid,$datas)
     {
         return $this->table('room_extend')->where(['userid' => $userid])->update($datas);

+ 45 - 0
helper/room/author.php

@@ -0,0 +1,45 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 2018/7/5
+ * Time: 下午4:41
+ */
+
+
+namespace room;
+
+class author
+{
+    static public function sign_web($roomid,$userid,$room_type)
+    {
+        $data = ['room' => $roomid,'user' => $userid,'room_type' => $room_type];
+        $plaintext = json_encode($data);
+
+        $cipher="AES-128-CBC";
+        $ivlen = openssl_cipher_iv_length($cipher);
+        $iv = self::zero_iv($ivlen);
+        return openssl_encrypt($plaintext, $cipher, self::passwd(), 0, $iv);
+    }
+
+    public function verify()
+    {
+
+    }
+
+    static private function zero_iv($ivlen)
+    {
+        $iv = '';
+        for ($i = 0; $i < $ivlen; ++$i) {
+            $iv .= chr(0);
+        }
+        return $iv;
+    }
+
+    static private function passwd()
+    {
+        global $config;
+        $pass = $config['room_password'];
+        return $pass;
+    }
+}

+ 2 - 4
helper/room/bargain_room.php

@@ -8,7 +8,6 @@
 
 namespace room;
 
-use url_helper;
 class bargain
 {
     private $mParams;
@@ -89,10 +88,9 @@ class bargain
 class bargain_room extends base_room
 {
     private $mManager;
-
-    public function __construct($cinfos, $roomkeys = [])
+    public function __construct($cinfos, $participants = [])
     {
-        parent::__construct($cinfos,$roomkeys);
+        parent::__construct($cinfos,$participants);
 
         $this->mRoomType = 'bargain_goods';
         $this->mManager = new bargain_manager($this->room_id());

+ 79 - 109
helper/room/base_room.php

@@ -10,111 +10,111 @@ namespace room;
 
 use member_info;
 use Log;
+use Exception;
 
 abstract class base_room extends base_info
 {
     protected $mRoomid;
-    protected $mRoomkeys; //每个人都有一个唯一的roomkey
+    protected $mParticipants; //每个人都有一个唯一的roomkey
     protected $mRoomType;
     protected $mod_room;
-    protected $mAccReq;
     protected $mCurRespMsgs;
 
-    public function __construct($cinfos, $roomkeys = [])
+    public function __construct($cinfos, $participants = [])
     {
         parent::__construct($cinfos);
 
-        $this->mAccReq = false;
         $this->mRoomid = $this->room_id();
         $this->mCurRespMsgs['return'] = [];
         $this->mCurRespMsgs['broadcast'] = [];
 
-        $this->mRoomkeys = $roomkeys;
+        $this->mParticipants = $participants;
         $this->mod_room = Model('room');
     }
 
-    public function inviteOp($input)
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    public function invite($inviter,$invitees)
     {
-        $this->clear();
-        $userid = intval($input['user']);
-        if($userid > 0) {
-            $room_key = $this->invite($userid);
-            $ret = ['room_key' => $room_key,'room' => $this->mRoomid];
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    public function invite($userid)
-    {
-        $item = Model('member')->getMemberInfo(['member_id' => $userid]);
-        if(empty($item)) return false;
-
-        $uinfo = new member_info($item);
-        $participant = $this->room_key($uinfo->unionid());
-        $ret = $this->find($participant);
-        if($ret == false)
+        if($this->verify_inviter($inviter))
         {
-            $ret = $this->mod_room->invite($this->room_id(),$userid,$participant);
-            if($ret == false) {
-                Log::record(__METHOD__ . " invite error",Log::ERR);
-                return false;
+            $users = $this->add($inviter,$invitees);
+            if($users === false) {
+                $ret = ['room' => $this->mRoomid,'invitees' => []];
             }
             else {
-                $this->mRoomkeys[$participant] = ['active' => false,
-                    'nickname' => $uinfo->nickname(),'avatar' => $uinfo->avatar(),'userid' => intval($userid)];
+                $ret = ['room' => $this->mRoomid,'invitees' => $users];
             }
+            return $ret;
+        }
+        else {
+            return false;
         }
-        return $participant;
     }
-
-    public function reject($roomkey)
+    private function verify_inviter($inviter)
     {
-        $ret = $this->find($roomkey);
-        if($ret != false) {
-            unset($this->mRoomkeys[$roomkey]);
+        if($this->creator() == $inviter) {
+            return true;
+        }
+        else {
+            $ret = $this->find($inviter);
+            return ($ret === false) ? false : true;
         }
-        return true;
     }
-
-    protected function room_info($roomkey)
+    private function add($inviter,$invitees)
     {
-        $result = [];
-        $result['room'] = $this->mRoomid;
-        $result['users'] = [];
-        foreach ($this->mRoomkeys as $key => $item)
+        $invitees = array_unique($invitees);
+        $items = Model('member')->getMemberList(['member_id' => ['in',$invitees]]);
+        if(empty($items)) return false;
+
+        $users = [];
+        foreach ($items as $item) {
+            $userid = intval($item['member_id']);
+            $users[$userid] = $item;
+        }
+
+        $result  = [];
+        foreach ($invitees as $invitee)
         {
-            $result['users'][] = $item;
-            if($key == $roomkey) {
-                $result['me'] = $item['userid'];
+            try
+            {
+                if(!array_key_exists($invitee,$users)) continue;
+                $result[] = $invitee;
+
+                $ret = $this->find($invitee);
+                if($ret !== false) continue;
+
+                $ret = $this->mod_room->invite($this->room_id(),$invitee,$inviter);
+                if($ret == false) {
+                    Log::record(__METHOD__ . " room invite user fail on db Error",Log::ERR);
+                    return false;
+                }
+                else {
+                    $user = $users[$invitee];
+                    $uinfo = new member_info($user);
+                    $this->mParticipants[$invitee] = ['nickname' => $uinfo->nickname(),'avatar' => $uinfo->avatar(),'userid' => intval($invitee)];
+                }
+            }
+            catch (Exception $ex) {
+                Log::record($ex->getMessage(),Log::ERR);
             }
         }
 
         return $result;
     }
-
-    public function joinOp($input)
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    public function leave($userid)
     {
-        $this->clear();
-
-        $room_key = $input['room_key'];
-        if(empty($room_key)) {
-            return false;
-        }
-
-        if($this->join($room_key))
-        {
-//            $this->add_return([$room_key],'ret_join',$this->room_info($room_key));
-            $this->add_return([$room_key],'ret_join',[]);
-            $this->add_broad('join',$this->mRoomkeys[$room_key]);
+        $ret = $this->find($userid);
+        if($ret != false) {
+            unset($this->mParticipants[$userid]);
+            $this->mod_room->leave($this->room_id(),$userid);
             return true;
-        }
-        else {
+        } else {
             return false;
         }
     }
 
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     public function leaveOp($input)
     {
         $this->clear();
@@ -132,7 +132,7 @@ abstract class base_room extends base_info
             return false;
         }
     }
-
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     public function messageOp($input)
     {
         $this->clear();
@@ -151,10 +151,10 @@ abstract class base_room extends base_info
 
         return true;
     }
-    protected function validate_type($type,$content)
+    //////////////////////////////////////消息验证、返回、广播//////////////////////////////////////////////////////////////
+    protected function validate_type($type)
     {
         $stype = strtolower($type);
-
         if($stype == proto_type::msg_stype_text) {
             return proto_type::msg_type_text;
         }
@@ -225,69 +225,39 @@ abstract class base_room extends base_info
 
         $this->mCurRespMsgs['broadcast'][] = $msg;
     }
-
-    public function join($participant)
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    protected function find($userid)
     {
-        $ret = $this->find($participant);
-        if($ret != false) {
-            $this->mRoomkeys[$participant]['active'] = true;
-            return true;
-        } else {
-            return false;
-        }
-    }
+        if($userid <= 0) return false;
 
-    public function leave($participant)
-    {
-        $ret = $this->find($participant);
-        if($ret != false) {
-            $this->mRoomkeys[$participant]['active'] = false;
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    protected function find($participant)
-    {
-        if(empty($participant)) return false;
-        if(array_key_exists($participant,$this->mRoomkeys)) {
-            return $this->mRoomkeys[$participant];
+        if(array_key_exists($userid,$this->mParticipants)) {
+            return $this->mParticipants[$userid];
         } else {
             return false;
         }
     }
 
-    protected function room_key($unionid)
-    {
-        return md5("{$this->mRoomType}_{$this->mRoomid}_{$unionid}");
-    }
-
     public function room_type() {
         return $this->mRoomType;
     }
 
-    public function cur_msgs() {
-        return $this->mCurRespMsgs;
-    }
-
-    protected function times($room_key)
+    protected function times($userid)
     {
-        $userinfo = $this->find($room_key);
+        $userinfo = $this->find($userid);
         if($userinfo == false) {
             return 0;
         }
         else {
-            return intval($this->mRoomkeys[$room_key]['times']);
+            return intval($this->mParticipants[$userid]['times']);
         }
     }
 
-    protected function increase_times($room_key)
+    protected function increase_times($userid)
     {
-        $userinfo = $this->find($room_key);
+        $userinfo = $this->find($userid);
         if($userinfo != false) {
-            $times = intval($this->mRoomkeys[$room_key]['times']) + 1;
-            $this->mRoomkeys[$room_key]['times'] = $times;
+            $times = intval($this->mParticipants[$userid]['times']) + 1;
+            $this->mParticipants[$userid]['times'] = $times;
         }
     }
 }

+ 2 - 2
helper/room/chatwo_room.php

@@ -10,9 +10,9 @@ namespace room;
 
 class chatwo_room extends base_room
 {
-    public function __construct($cinfos, $roomkeys = [])
+    public function __construct($cinfos, $participants = [])
     {
         $this->mRoomType = 'chatwo';
-        parent::__construct($cinfos,$roomkeys);
+        parent::__construct($cinfos,$participants);
     }
 }

+ 60 - 0
helper/room/cli_seq.puml

@@ -0,0 +1,60 @@
+@startuml
+actor requestor
+actor sock_cli
+
+== Get Authen Info ==
+requestor o-> fcgi : fetch authorize info and acc_addr
+activate fcgi
+fcgi --> room_factory : build all rooms
+activate room_factory
+room_factory -> room_svr : invite until build room
+activate room_svr
+room_svr -> room_factory
+deactivate room_svr
+room_factory --> fcgi
+deactivate room_factory
+fcgi -->o requestor : resp authorize info
+deactivate fcgi
+
+== Get Rooms ==
+requestor o-> fcgi : list_rooms
+activate fcgi
+fcgi ->o requestor : rooms
+deactivate fcgi
+
+== Get Unreaded Messages ==
+requestor o-> fcgi : unread msgs,roomid
+activate fcgi
+fcgi ->o requestor : unread msgs
+deactivate fcgi
+
+== invite ==
+fcgi o-> room_factory : invite(roomid,inviter,invitee)
+activate room_factory
+room_factory -> room_svr : invite(roomid,inviter,invitee)
+activate room_svr
+room_svr -> room_svr : check inviter
+room_svr -> room_svr : add invitee
+room_svr -> room_factory : resp invite result
+deactivate room_svr
+room_factory -> room_factory : gen token(userid,roomid)
+room_factory ->o fcgi : resp token
+deactivate room_factory
+
+== Login ==
+collections access
+sock_cli o-> access : login with authorize
+activate access
+access -> access : decode author info
+
+access ->o sock_cli : author success
+deactivate access
+
+
+
+
+
+
+
+
+@enduml

+ 4 - 10
helper/room/factory.php

@@ -41,6 +41,7 @@ class factory
     {
         $mod_room = Model('room');
         $room_params = $mod_room->getRoom($room_id);
+
         if(empty($room_params)) return false;
         $participants = self::participants($room_id);
 
@@ -156,30 +157,23 @@ class factory
         $mod_room = Model('room');
         $items = $mod_room->participants($roomid);
 
-        $key_ids = [];
         $uids = [];
         foreach ($items as $item) {
             $uid = intval($item['member_id']);
-            $room_key  = $item['room_key'];
-            $key_ids[$room_key] = $uid;
             $uids[] = $uid;
         }
 
         $uids = array_unique($uids,SORT_NUMERIC);
-        $members = Model('member')->getMemberList(array('member_id' => array('in',$uids)));
+        $members = Model('member')->getMemberList(['member_id' => ['in',$uids]]);
 
         $uid_infos = [];
         foreach ($members as $member) {
             $uinfo = new member_info($member);
             $user = $uinfo->member_id();
-            $item = ['avatar' => $uinfo->avatar(),'nickname' => $uinfo->nickname(),'userid' => $uinfo->member_id(),'active' => false];
+            $item = ['avatar' => $uinfo->avatar(),'nickname' => $uinfo->nickname(),'userid' => $uinfo->member_id()];
             $uid_infos[$user] = $item;
         }
-        $result = [];
-        foreach ($key_ids as $key => $uid) {
-            $result[$key] = $uid_infos[$uid];
-        }
 
-        return $result;
+        return $uid_infos;
     }
 }

+ 16 - 1
helper/room/factory_client.php

@@ -108,7 +108,22 @@ class factory_client extends tcp_client
         }
     }
 
-    public function invite($roomid,$user)
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    public function invite($roomid, $inviter,$invitees)
+    {
+        $param = ["act" => 'factory','op' => 'invite','room' => $roomid,'inviter' => $inviter,'invitees' => $invitees];
+        $result = $this->request($param);
+        if(empty($result)) return false;
+
+        $code = intval($result['code']);
+        if($code != 200 || empty($result['data']['invitees'])) {
+            return false;
+        }
+        else {
+            return $result['data'];
+        }
+    }
+    public function leave($roomid, $user)
     {
         $param = ["act" => 'factory','op' => 'invite','room' => $roomid,'user' => $user];
         $result = $this->request($param);

+ 48 - 12
helper/room/factory_processor.php

@@ -38,8 +38,7 @@ class factory_processor implements IProcessor
 
     public function onRequest($bufid, $body)
     {
-        $checker = new scope_trace(__METHOD__);
-
+        new scope_trace(__METHOD__);
         $input = json_decode($body,true);
         if($input == false) {
             return false;
@@ -73,13 +72,13 @@ class factory_processor implements IProcessor
                 if($invite)
                 {
                     $roomid  = $ret['room'];
-                    $userid  = $ret['creator'];
+                    $inviter  = $ret['creator'];
 
-                    if($roomid <= 0 || $userid <= 0) {
+                    if($roomid <= 0 || $inviter <= 0) {
                         return $this->error(errcode::ErrRoomCreate);
                     }
 
-                    $result = $this->invite($roomid,$userid);
+                    $result = $this->invite($roomid,$inviter,[$inviter]);
                     if($result != false) {
                         $ret = array_merge($ret,$result);
                         return $this->success($ret);
@@ -96,15 +95,31 @@ class factory_processor implements IProcessor
         }
         elseif($op == 'invite')
         {
-            $roomid = intval($input['room']);
-            $userid = intval($input['user']);
+            $roomid   = intval($input['room']);
+            $inviter  = intval($input['inviter']);
+            $invitees = $input['invitees'];
+
+            if($roomid <= 0 || $inviter <= 0 || empty($invitees)) {
+                return $this->error(errcode::ErrRoomInvite);
+            }
 
-            if($roomid <= 0 || $userid <= 0) {
+            $ret = $this->invite($roomid,$inviter,$invitees);
+            if($ret != false) {
+                return $this->success($ret);
+            } else {
                 return $this->error(errcode::ErrRoomInvite);
             }
+        }
+        elseif($op == 'leave')
+        {
+            $roomid   = intval($input['room']);
+            $user  = intval($input['user']);
 
-            $ret = $this->invite($roomid,$userid);
+            if($roomid <= 0 || $user <= 0) {
+                return $this->error(errcode::ErrRoomInvite);
+            }
 
+            $ret = $this->leave($roomid,$user);
             if($ret != false) {
                 return $this->success($ret);
             } else {
@@ -116,13 +131,13 @@ class factory_processor implements IProcessor
         }
     }
 
-    private function invite($roomid,$user)
+    private function invite($roomid, $inviter,$invitees)
     {
         foreach ($this->mRoomClients as  $client)
         {
             if($client->contain_room($roomid))
             {
-                $ret = $client->invite($roomid,$user);
+                $ret = $client->invite($roomid,$inviter,$invitees);
                 if($ret != false) {
                     return $ret;
                 }
@@ -132,7 +147,7 @@ class factory_processor implements IProcessor
         $client = $this->room_client();
         if($client != false)
         {
-            $ret = $client->invite($roomid,$user);
+            $ret = $client->invite($roomid,$inviter,$invitees);
             if($ret != false) {
                 $client->add_room($roomid);
             }
@@ -141,6 +156,27 @@ class factory_processor implements IProcessor
         return $ret;
     }
 
+    private function leave($roomid, $user)
+    {
+        foreach ($this->mRoomClients as  $client)
+        {
+            if($client->contain_room($roomid))
+            {
+                $ret = $client->leave($roomid,$user);
+                if($ret != false) {
+                    return $ret;
+                }
+            }
+        }
+
+        $client = $this->room_client();
+        if($client != false) {
+            return $client->leave($roomid,$user);
+        } else {
+            return false;
+        }
+    }
+
     private function room_client()
     {
         $count = count($this->mRoomClients);

+ 4 - 4
helper/room/group_room.php

@@ -11,17 +11,17 @@ namespace room;
 
 class group_room extends base_room
 {
-    public function __construct($cinfos, array $roomkeys = [])
+    public function __construct($cinfos, array $participants = [])
     {
-        parent::__construct($cinfos, $roomkeys);
+        parent::__construct($cinfos, $participants);
     }
 }
 
 class shake_room extends group_room
 {
-    public function __construct($cinfos, array $roomkeys = [])
+    public function __construct($cinfos, array $participants = [])
     {
-        parent::__construct($cinfos, $roomkeys);
+        parent::__construct($cinfos, $participants);
     }
     public function shakeOp($input)
     {

+ 16 - 2
helper/room/room_client.php

@@ -81,9 +81,23 @@ class room_client extends tcp_client
         return "tcp://{$this->mHost}:{$this->mPort}";
     }
 
-    public function invite($roomid,$user)
+    public function invite($roomid, $inviter,$invitees)
     {
-        $param = ["act" => 'factory','op' => 'invite','room' => $roomid,'user' => $user];
+        $param = ["act" => 'factory','op' => 'invite','room' => $roomid,'inviter' => $inviter,'invitees' => $invitees];
+        $result = $this->request($param);
+        if(empty($result)) return false;
+
+        $code = intval($result['code']);
+        if($code != 200) {
+            return false;
+        }
+        else {
+            return $result['data'];
+        }
+    }
+    public function leave($roomid, $user)
+    {
+        $param = ["act" => 'factory','op' => 'leave','room' => $roomid,'user' => $user];
         $result = $this->request($param);
         if(empty($result)) return false;
 

+ 14 - 0
helper/room/room_comp.puml

@@ -0,0 +1,14 @@
+@startuml
+
+package "Some Group" {
+HTTP - [First Component]
+[Another Component]
+}
+
+package "Other Groups" {
+FTP - [Second Component]
+
+[First Component] --> FTP
+}
+
+@enduml

+ 48 - 9
helper/room/room_processor.php

@@ -28,7 +28,7 @@ class room_processor implements IProcessor
 
     public function onRequest($bufid, $body)
     {
-        $checker = new scope_trace(__METHOD__);
+        new scope_trace(__METHOD__);
 
         $input = json_decode($body,true);
         if($input == false) {
@@ -57,7 +57,7 @@ class room_processor implements IProcessor
         $this->remove_acc($bufid);
     }
 
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////Factory Message Handler/////////////////////////////////////////////////////
     private function onFactory($bufid,$input)
     {
         $op = $input['op'];
@@ -86,7 +86,9 @@ class room_processor implements IProcessor
         elseif($op == 'invite')
         {
             $roomid = intval($input['room']);
-            if($roomid <= 0) return $this->error(errcode::ErrRoomParam);
+            if($roomid <= 0) {
+                return $this->error(errcode::ErrRoomParam);
+            }
 
             if(!array_key_exists($roomid,$this->mRooms))
             {
@@ -101,23 +103,59 @@ class room_processor implements IProcessor
 
             if($room != false)
             {
-                $userid = intval($input['user']);
-                if($userid > 0)
+                $inviter  = intval($input['inviter']);
+                $invitees = $input['invitees'];
+
+                if($inviter > 0 && !empty($invitees))
                 {
-                    $room_key = $room->invite($userid);
-                    if($room_key != false) {
-                        return $this->success(['room' => $roomid,'room_key' => $room_key]);
+                    $result = $room->invite($inviter,$invitees);
+                    if($result != false) {
+                        return $this->success($result);
                     }
                 }
             }
+
             return $this->error(errcode::ErrRoomInvite);
         }
+        elseif($op == 'leave')
+        {
+            $roomid = intval($input['room']);
+            if($roomid <= 0) {
+                return $this->error(errcode::ErrRoomParam);
+            }
+
+            if(!array_key_exists($roomid,$this->mRooms))
+            {
+                $room = $this->mFactory->build($roomid);
+                if($room != false) {
+                    $this->mRooms[$roomid] = $room;
+                }
+            }
+            else {
+                $room = $this->room($roomid);
+            }
+
+            if($room != false)
+            {
+                $userid  = intval($input['user']);
+                if($userid > 0)
+                {
+                    $result = $room->leave($userid);
+                    if($result != false) {
+                        return $this->success($result);
+                    }
+                }
+            }
+
+            return $this->error(errcode::ErrRoomLeave);
+        }
         else
         {
             return $this->error(errcode::ErrRoomFactoryOp);
         }
     }
 
+    ////////////////////////////////////////Access Message Handler//////////////////////////////////////////////////////
     private function onAccess($bufid,$input)
     {
         $op = $input['op'];
@@ -139,7 +177,7 @@ class room_processor implements IProcessor
         }
         return $result;
     }
-
+    ////////////////////////////////////////Room Message Handler////////////////////////////////////////////////////////
     private function onRoom($bufid,$input)
     {
         $roomid = intval($input['room']);
@@ -166,6 +204,7 @@ class room_processor implements IProcessor
         return false;
     }
 
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     private function del_user($bufid,$room_id,$roomkeys)
     {
         $msg = [];

+ 12 - 0
helper/room/talk_case.puml

@@ -0,0 +1,12 @@
+@startuml
+left to right direction
+skinparam packageStyle rectangle
+actor 客户
+actor 店员
+rectangle checkout {
+  客户 -- (checkout)
+  (checkout) .> (payment) : include
+  (help) .> (checkout) : extends
+  (checkout) -- 店员
+}
+@enduml

+ 38 - 0
helper/room/webroom_seq.puml

@@ -0,0 +1,38 @@
+@startuml
+
+actor requestor
+actor sock_cli
+
+== fcgi invite ==
+
+requestor o-> fcgi : open web page
+fcgi -> room_factory : invite(inviter,invitees)
+room_factory -> room_svr : invite
+room_svr --> room_svr : build room and add invitee
+room_svr --> room_factory : result
+
+
+room_factory -> fcgi : roomid,invitees
+
+fcgi -> publisher : roomid belong user
+publisher -> subscriber : roomid belong user
+subscriber -> access : roomid belong user
+access -> access : add roomid to user
+
+fcgi -> fcgi : generator authon authon
+
+fcgi -->o requestor : authon info
+
+== Login ==
+requestor -> sock_cli : authon info
+collections access
+sock_cli -> access : join with roomkey
+access -> room_svr : join
+room_svr -> access : broad cast new user
+
+
+sock_cli -> access : msg with roomid
+access -> room_svr : msg
+room_svr -> access : broad cast msg
+
+@enduml

+ 1 - 1
helper/search/tcp_client.php

@@ -80,7 +80,7 @@ abstract class tcp_client
         }
 
         $host = $this->remote_addr();
-        $this->mSocket = stream_socket_client ($host,$err,$errno,30);
+        $this->mSocket = @stream_socket_client ($host,$err,$errno,30);
         if($this->mSocket == false) {
             Log::record("connect server err host:{$host} code:{$errno} : {$err}");
             return false;

+ 23 - 5
mobile/control/game.php

@@ -10,10 +10,11 @@ defined('InShopNC') or exit('Access Invalid!');
 
 require_once(BASE_ROOT_PATH . '/helper/search/tcp_client.php');
 require_once(BASE_ROOT_PATH . '/helper/room/factory_client.php');
+require_once(BASE_ROOT_PATH . '/helper/room/proto_type.php');
+require_once(BASE_ROOT_PATH . '/helper/room/author.php');
 
 class gameControl extends mbMemberControl
 {
-
     public function __construct()
     {
         parent::__construct();
@@ -22,15 +23,32 @@ class gameControl extends mbMemberControl
     public function shakeOp()
     {
         global $config;
-        $shake_room = $config['special_rooms']['shake_bonus'];
+        $room_id = $config['special_rooms']['shake_bonus'];
         $webaddr = $config['access_addr'];
+        $creator = self::shake_creator($room_id);
+        $ret = room\factory_client::instance()->invite($room_id,$creator,[session_helper::memberid()]);
 
-        $_SESSION['client_type'] = "wap";
-        $ret = room\factory_client::instance()->invite($shake_room,session_helper::memberid());
+        $result = [];
         if($ret != false) {
-            $ret['addr'] = $webaddr;
+            $result['addr'] = $webaddr;
+            $result['token'] = room\author::sign_web($room_id,session_helper::memberid(),room\proto_type::act_shake_bonus);
         }
 
+        $_SESSION['client_type'] = "wap";
         return self::outsuccess($ret,"game/shake_bonus");
     }
+
+    static private function shake_creator($room_id)
+    {
+        static $stCreator = 0;
+
+        if($stCreator == 0) {
+            $mod_room = Model('room');
+            $params = $mod_room->getRoom($room_id);
+            $rinfo = new room\base_info($params);
+            $stCreator = $rinfo->creator();
+        }
+
+        return $stCreator;
+    }
 }

+ 1 - 0
mobile/control/login.php

@@ -42,6 +42,7 @@ class loginControl extends mobileHomeControl
         else {
             $fcode = new user_session\fcode();
             $fcode->onStatus();
+
             return self::outsuccess($this->ret_value());
         }
     }

+ 3 - 3
mobile/util/errcode.php

@@ -91,7 +91,7 @@ class errcode extends SplEnum
     const ErrRoom = 18000;
     const ErrRoomCreate = 18001;
     const ErrRoomInvite = 18002;
-    const ErrRoomJoin   = 18003;
+    const ErrRoomLeave   = 18003;
     const ErrRoomBuild  = 18004;
     const ErrRoomParam  = 18005;
     const ErrRoomFactoryOp  = 18006;
@@ -189,8 +189,8 @@ class errcode extends SplEnum
                     return '房间创建出错.';
             case errcode::ErrRoomInvite:
                 return '房间邀请出错.';
-            case errcode::ErrRoomJoin:
-                return '加入房间出错.';
+            case errcode::ErrRoomLeave:
+                return '退出房间出错.';
             case errcode::ErrRoomBuild:
                 return '房间重建出错.';
             case errcode::ErrRoomParam:

+ 21 - 6
test/TestRoomFactory.php

@@ -40,7 +40,7 @@ class TestRoomFactory extends PHPUnit_Framework_TestCase
     {
         $processor = new room\factory_processor();
         $creator = 36429;
-        $ret = $processor->onRequest(0,json_encode(["act" => 'factory','op' => 'create', "type" => 'group','creator' => $creator]));
+        $ret = $processor->onRequest(0,json_encode(["act" => 'factory','op' => 'create', "type" => 'group','creator' => $creator,'invite' => true]));
     }
 
     public function testProcessorInvite()
@@ -48,9 +48,9 @@ class TestRoomFactory extends PHPUnit_Framework_TestCase
         $processor = new room\factory_processor();
         $roomid=30;
         $user = 36429;
-        $ret = $processor->onRequest(0,json_encode(["act" => 'factory','room' => $roomid,'op' => 'invite','user' => $user]));
+        $ret = $processor->onRequest(0,json_encode(["act" => 'factory','op' => 'invite','room' => $roomid,'inviter' => $user,'invitees' => [36500]]));
         $user = 36430;
-        $ret = $processor->onRequest(0,json_encode(["act" => 'factory','room' => $roomid,'op' => 'invite','user' => $user]));
+        $ret = $processor->onRequest(0,json_encode(["act" => 'factory','op' => 'invite','room' => $roomid,'inviter' => $user,'invitees' => [36500]]));
     }
     public function testProcessorCreateShake()
     {
@@ -76,19 +76,34 @@ class TestRoomFactory extends PHPUnit_Framework_TestCase
     {
         $processor = new room\factory_processor();
         $creator = 36483;
-        $ret = $processor->onRequest(0,json_encode(["act" => 'factory','op' => 'create', "type" => 'bargain_goods',
-            'creator' => $creator,'goods_id' => 4831,'lowest_price' => 10,'usable_days' => 3,'random' => 1,'total_num' => 10]));
+        $ret = $processor->onRequest(0,json_encode(["act" => 'factory','op' => 'create', "type" => 'bargain_goods','creator' => $creator,
+            'goods_id' => 4831,'lowest_price' => 10,'usable_days' => 3,'random' => 1,'total_num' => 10]));
+    }
+
+    public function testInvite()
+    {
+        $processor = new room\factory_processor();
+        $req = ["act" => 'factory','op' => 'invite','room' => 30,'inviter' => $this->creator(30),'invitees' => [36500]];
+        $ret = $processor->onRequest(0,json_encode($req));
     }
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     public function testSocketInvite()
     {
         $user = 36429;
-        $ret = room\factory_client::instance()->invite(37,$user);
+        $ret = room\factory_client::instance()->invite(37,self::admin_member_id,[$user]);
     }
 
     public function testShakeBonus()
     {
         $ret = room\factory_client::instance()->create_shake(self::admin_member_id);
     }
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    private function creator($room_id)
+    {
+        $mod_room = Model('room');
+        $params = $mod_room->getRoom($room_id);
+        $rinfo = new room\base_info($params);
+        return $rinfo->creator();
+    }
 }

+ 16 - 10
test/TestRoomSrv.php

@@ -23,6 +23,9 @@ require_once(BASE_ROOT_PATH . '/helper/room/room_client.php');
 
 class TestRoomSrv extends PHPUnit_Framework_TestCase
 {
+    const room_id = 30;
+    const creator = 36429;
+
     public static function setUpBeforeClass()
     {
         Base::run_util();
@@ -32,25 +35,21 @@ class TestRoomSrv extends PHPUnit_Framework_TestCase
     {
         $roomid=43;
         $processor = new room\room_processor();
-        $ret = $processor->onRequest(0,json_encode(["act" => 'factory','room' => $roomid,'op' => 'build']));
+        $ret = $processor->onRequest(0,json_encode(["act" => 'factory','room' => self::room_id,'op' => 'build']));
     }
 
     public function testInviteRoom()
     {
-        $roomid=37;
-        $user = 36429;
+        $invitee = 36507;
         $processor = new room\room_processor();
-        $ret = $processor->onRequest(0,json_encode(["act" => 'factory','room' => $roomid,'op' => 'invite','user' => $user]));
+        $ret = $processor->onRequest(0,json_encode(["act" => 'factory','op' => 'invite','room' => self::room_id,'inviter' => $this->creator(self::room_id),'invitees' => [$invitee]]));
     }
 
-    public function testJoin()
+    public function testLeaveRoom()
     {
-        $roomid=30;
-        $user = 36429;
+        $user = 36507;
         $processor = new room\room_processor();
-        $ret = $processor->onRequest(0,json_encode(["act" => 'factory','room' => $roomid,'op' => 'invite','user' => $user]));
-        $ret = $processor->onRequest(0,json_encode(['op' => 'join','room' => $roomid,"room_key" => "d9d7668daad276fa4f02d5f029da0613"]));
-        $ret = $processor->onRequest(0,json_encode(['op' => 'join','room' => $roomid,"room_key" => "d9d7668daad276fa4f02d5f029da0614"]));
+        $ret = $processor->onRequest(0,json_encode(["act" => 'factory','op' => 'leave','room' => self::room_id,'user' => $user]));
     }
 
     public function testListRoom()
@@ -61,4 +60,11 @@ class TestRoomSrv extends PHPUnit_Framework_TestCase
         $ret = $processor->onRequest(0,json_encode(["act" => 'access','op' => 'list']));
     }
 
+    private function creator($room_id)
+    {
+        $mod_room = Model('room');
+        $params = $mod_room->getRoom($room_id);
+        $rinfo = new room\base_info($params);
+        return $rinfo->creator();
+    }
 }

文件差異過大導致無法顯示
+ 34 - 0
test/TestSearch.php


+ 7 - 0
test/TestWebsocket.php

@@ -0,0 +1,7 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 2018/7/5
+ * Time: 下午5:13
+ */