member_talk.php 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 2018/7/12
  6. * Time: 上午11:29
  7. */
  8. require_once(BASE_ROOT_PATH . '/helper/search/tcp_client.php');
  9. require_once(BASE_ROOT_PATH . '/helper/room/factory_client.php');
  10. require_once(BASE_ROOT_PATH . '/helper/room/proto_type.php');
  11. require_once(BASE_ROOT_PATH . '/helper/room/room_info.php');
  12. require_once(BASE_ROOT_PATH . '/helper/room/author.php');
  13. require_once(BASE_ROOT_PATH . '/helper/room/util.php');
  14. require_once(BASE_ROOT_PATH . '/helper/room/tpl_group_home.php');
  15. require_once(BASE_ROOT_PATH . '/helper/room/tpl_chatwo_home.php');
  16. require_once(BASE_ROOT_PATH . '/helper/FileUploader.php');
  17. require_once(BASE_ROOT_PATH . '/helper/room/face_room.php');
  18. require_once(BASE_ROOT_PATH . '/helper/util_helper.php');
  19. use room\proto_type;
  20. class member_talkControl extends mbMemberControl
  21. {
  22. const max_msgid = 1 << 32;
  23. const donate_rate = 100;
  24. private $mAccaddr;
  25. public function __construct()
  26. {
  27. parent::__construct();
  28. global $config;
  29. $this->mAccaddr = $config['access_addr'];
  30. }
  31. public function authonOp()
  32. {
  33. $result = [];
  34. $result['addr'] = $this->mAccaddr;
  35. $result['token'] = room\author::sign_native(session_helper::memberid());
  36. $result['user'] = session_helper::memberid();
  37. return self::outsuccess($result);
  38. }
  39. public function talksOp()
  40. {
  41. $talks_helper = new room\talks_helper();
  42. $input = base64_decode($_POST['cmp_table']);
  43. $result = $talks_helper->talks(session_helper::memberid(),$input);
  44. return self::outsuccess($result);
  45. }
  46. public function friendsOp()
  47. {
  48. $talks_helper = new room\talks_helper();
  49. $friends = $talks_helper->friends(session_helper::memberid());
  50. $members = member_info::get_members($friends);
  51. usort($members,['member_info','alpha_compare']);
  52. $uids = [];
  53. $mem_desc = [];
  54. foreach ($members as $member) {
  55. if($member['member_id'] == session_helper::memberid()) continue;
  56. $uids[] = $member['member_id'];
  57. $mem_desc[] = $member;
  58. }
  59. return self::outsuccess(['friends' => $uids,
  60. 'count' => count($uids),
  61. 'mem_desc' => $mem_desc,
  62. 'mobile_page' => mobile_page(1)]);
  63. }
  64. public function msgsOp()
  65. {
  66. $msgid = intval($_GET['msgid']);
  67. $type = $_GET['type'];
  68. if($msgid == 0 || empty($type)) {
  69. return self::outerr(errcode::ErrParamter);
  70. }
  71. if($msgid < 0) {
  72. $msgid = self::max_msgid;
  73. }
  74. if($type == 'room')
  75. {
  76. $room_id = intval($_GET['room']);
  77. if($room_id <= 0) {
  78. return self::outerr(errcode::ErrParamter);
  79. }
  80. $result = $this->roomsg($msgid,$room_id);
  81. $msgs = $this->format_message($result['uids'],$result['msgs'],$type,0,$room_id);
  82. }
  83. elseif($type == 'chatwo')
  84. {
  85. $user = intval($_GET['user']);
  86. if($user <= 0) {
  87. return self::outerr(errcode::ErrParamter);
  88. }
  89. $result = $this->chatwomsg($msgid,$user);
  90. $msgs = $this->format_message($result['uids'],$result['msgs'],$type,$user);
  91. }
  92. else {
  93. $msgs = [];
  94. Log::record(__METHOD__ . " : invalid type={$type}.",Log::ERR);
  95. }
  96. return self::outsuccess(["msgs" => $msgs]);
  97. }
  98. private function format_message($uids,$msgs,$type,$other=0,$room_id=0)
  99. {
  100. $members = [];
  101. if(!empty($uids))
  102. {
  103. $room_members = Model('room')->getRoomParts(["room_id"=>$room_id],'member_id,member_nick',false);
  104. $nicknames = [];
  105. if(!empty($room)) {
  106. foreach ($room_members as $room_member){
  107. $nicknames[$room_member['member_id']] = $room_member['member_nick'];
  108. }
  109. }
  110. $items = Model('member')->getMemberList(['member_id' => ['in',$uids]]);
  111. foreach ($items as $item)
  112. {
  113. try
  114. {
  115. $info = new member_info($item);
  116. $val = [];
  117. $mid = $info->member_id();
  118. $nickname = empty($nicknames[$mid]) ? $info->nickname() : $nicknames[$mid];
  119. $val['avatar'] = $info->avatar();
  120. $val['nickname'] = $nickname;
  121. $val['userid'] = $mid;
  122. $members[$mid] = $val;
  123. }
  124. catch (Exception $ex) {
  125. Log::record($ex->getMessage(),Log::ERR);
  126. }
  127. }
  128. }
  129. $result = [];
  130. if(!empty($msgs))
  131. {
  132. foreach ($msgs as $msg)
  133. {
  134. $msgtype = proto_type::from_msgtype(intval($msg['type']));
  135. if($msgtype == false) continue;
  136. $val = [];
  137. $val["act"] = $type;
  138. $val["op"] = "message";
  139. $val["msgtype"] = "message";
  140. $from = intval($msg['member_id']);
  141. $member = $members[$from];
  142. if($type == 'room') {
  143. $val["room"] = intval($msg['room_id']);
  144. }
  145. elseif($type == 'chatwo')
  146. {
  147. $val['from'] = $from;
  148. if($from == session_helper::memberid()) {
  149. $val['to'] = $other;
  150. }
  151. else {
  152. $val['to'] = session_helper::memberid();
  153. }
  154. }
  155. else {
  156. }
  157. $val['content'] = ['msgid' => intval($msg['msg_id']), 'from' => $member,'type' => $msgtype,'content' => $msg['msg'],'send_time' => intval($msg['add_time'])];
  158. $result[] = $val;
  159. }
  160. }
  161. return $result;
  162. }
  163. private function roomsg($msgid,$room_id)
  164. {
  165. $user = session_helper::memberid();
  166. $mod_room = Model('room');
  167. $room = $mod_room->getRoomParts(["room_id"=>$room_id, "member_id"=>$user, "state" => 0],"hide_msg",1);
  168. if(!empty($room)){
  169. $hide_msg = intval($room[0]["hide_msg"]);
  170. }else{
  171. return ['uids' => [],'msgs' => []];
  172. }
  173. $msgs = $mod_room->getRoomsgList(['room_id' => $room_id,'msg_id' => [['gt',$hide_msg],['lt',$msgid]],'msg_type' => 0], $this->page_size);
  174. $uids = [];
  175. if($msgs)
  176. {
  177. usort($msgs,['room\sorter','msgid_asc']);
  178. foreach ($msgs as $msg) {
  179. $uids[] = intval($msg['member_id']);
  180. }
  181. $uids = array_unique($uids);
  182. }
  183. return ['uids' => $uids,'msgs' => $msgs];
  184. }
  185. private function chatwomsg($msgid,$user)
  186. {
  187. $mod_room = Model('room');
  188. $left = session_helper::memberid();
  189. $right = $user;
  190. $chat_id = $mod_room->findChatid($left,$right);
  191. if($chat_id == false) {
  192. return ['uids' => [$left,$right],'msgs' => []];
  193. }
  194. $msgs = $mod_room->getRoomsgList(['room_id' => $chat_id,'msg_id' => ['lt',$msgid],'msg_type' => 1], $this->page_size);
  195. if($msgs){
  196. usort($msgs,['room\sorter','msgid_asc']);
  197. }
  198. return ['uids' => [$left,$right],'msgs' => $msgs];
  199. }
  200. private function applysmsg($msgid,$user){
  201. }
  202. public function create_roomOp()
  203. {
  204. $creator = session_helper::memberid();
  205. $result = room\factory_client::instance()->create_chat($creator);
  206. if($result == false) {
  207. return self::outerr(errcode::ErrRoom,"建群失败");
  208. }
  209. $room_id = $result['room'];
  210. if(!empty($_GET['invitees']))
  211. {
  212. $invitees = explode(',', trim($_GET['invitees']));
  213. if(!empty($invitees) && $room_id > 0)
  214. {
  215. $_invitees = array_values(array_diff($invitees,[$creator]));
  216. $ret = room\factory_client::instance()->invite($room_id,$creator,$_invitees);
  217. if($ret == false) return self::outerr(errcode::ErrRoom,"邀请失败");
  218. if(in_array($creator,$invitees)){
  219. $userNum = count($invitees);
  220. }else{
  221. $userNum = count($invitees) + 1;
  222. }
  223. return self::outsuccess(["room_id"=>$room_id,"room_name" => "群聊(".$userNum.")"]);
  224. }else {
  225. return self::outerr(errcode::ErrRoom,"建群失败");
  226. }
  227. }
  228. else {
  229. return self::outsuccess(["room_id"=>$room_id,"room_name"=>"群聊"]);
  230. }
  231. }
  232. ////////////面对面建群////////////////////////////////////////////////////////////////////////////////////////////////
  233. private function face_param(&$err)
  234. {
  235. $code = trim($_GET['code']);
  236. $loc = $this->parase_location($_GET['coordinate']);
  237. if(empty($code) || strlen($code) != 4 || !is_numeric($code)) {
  238. $err = ['code' => errcode::ErrParamter,'msg' => "请输入4位密码"];
  239. return false;
  240. }
  241. if($loc == false) {
  242. $err = ['code' => errcode::ErrParamter,'msg' => "需要地理位置信息才能面对面建群"];
  243. return false;
  244. }
  245. $geo = new geohash();
  246. $hash = $geo->encode($loc['lat'],$loc['lng']);
  247. $hash = substr($hash, 0, 7);
  248. Log::record("loc={$_GET['coordinate']},code = {$code} hash={$hash}",Log::DEBUG);
  249. return ['code' => $code,'lochash' => $hash];
  250. }
  251. public function find_faceOp()
  252. {
  253. $params = $this->face_param($err);
  254. if($params == false) {
  255. return self::outerr($err['code'],$err['msg']);
  256. }
  257. $code = $params['code'];
  258. $lochash = $params['lochash'];
  259. $face = new room\face_room($code,$lochash);
  260. $uids = $face->find(session_helper::memberid());
  261. if($uids === false) {
  262. return self::outerr(errcode::ErrRoomTwoFace,"面对面建群失败");
  263. }
  264. if(!empty($uids)) {
  265. $members = member_info::get_members($uids);
  266. } else {
  267. $members = [];
  268. }
  269. return self::outsuccess(['members' => $members]);
  270. }
  271. public function join_faceOp()
  272. {
  273. $params = $this->face_param($err);
  274. if($params == false) {
  275. return self::outerr($err['code'],$err['msg']);
  276. }
  277. $code = $params['code'];
  278. $lochash = $params['lochash'];
  279. $face = new room\face_room($code,$lochash);
  280. $room_id = $face->join(session_helper::memberid());
  281. if($room_id === false) {
  282. return self::outerr(errcode::ErrRoomTwoFace,"面对面建群失败");
  283. }
  284. $ret = room\factory_client::instance()->invite($room_id,$this->room_creator($room_id),[session_helper::memberid()]);
  285. if($ret === false) {
  286. return self::outerr(errcode::ErrRoom,"进群失败");
  287. }
  288. else
  289. {
  290. $mod_room = Model('room');
  291. $room = $mod_room->getRoom($room_id);
  292. $info = new room\room_info($room);
  293. $result['name'] = $info->name();
  294. return self::outsuccess(['result' => $ret]);
  295. }
  296. }
  297. public function leave_faceOp()
  298. {
  299. $params = $this->face_param($err);
  300. if($params == false) {
  301. return self::outerr($err['code'],$err['msg']);
  302. }
  303. $code = $params['code'];
  304. $lochash = $params['lochash'];
  305. $face = new room\face_room($code,$lochash);
  306. $face->leave(session_helper::memberid());
  307. return self::outsuccess(['result' => "true"]);
  308. }
  309. private function parase_location($location)
  310. {
  311. if(empty($location)) return false;
  312. $pos = explode(',',$location);
  313. if(count($pos) == 2) {
  314. return ['lat' => $pos[0],'lng' => $pos[1]];
  315. } else {
  316. return false;
  317. }
  318. }
  319. ///////////群内成员管理//////////////////////////////////////////////////////////////////////////////////////////////
  320. private function room_creator($room_id)
  321. {
  322. $mod_room = Model('room');
  323. $params = $mod_room->getRoom($room_id);
  324. $rinfo = new room\room_info($params);
  325. return $rinfo->creator();
  326. }
  327. public function room_usersOp()
  328. {
  329. $room_id = intval($_GET['room_id']);
  330. if($room_id <= 0) {
  331. return self::outerr(errcode::ErrParamter);
  332. }
  333. $parts = new room\room_parts($room_id);
  334. $uids = $parts->allparts([session_helper::memberid()]);
  335. $members = member_info::get_members($uids);
  336. return self::outsuccess([
  337. 'friends' => $uids,
  338. 'count' => count($uids),
  339. "mem_desc" => $members,
  340. 'mobile_page' => mobile_page(1)]);
  341. }
  342. public function inviteOp()
  343. {
  344. $room_id = intval($_GET['room_id']);
  345. $invitees = explode(',', trim($_GET['invitees']));
  346. if(empty($invitees) || $room_id <= 0) {
  347. return self::outerr(errcode::ErrParamter);
  348. }
  349. $inviter = session_helper::memberid();
  350. $_invitees = array_values(array_diff($invitees,[$inviter]));
  351. $result = room\factory_client::instance()->invite($room_id,$inviter,$_invitees);
  352. if($result === false) {
  353. return self::outerr(errcode::ErrRoom,"邀请失败");
  354. }
  355. else
  356. {
  357. $members = member_info::get_members($result['newusers']);
  358. $result['invitees'] = $members;
  359. return self::outsuccess($result);
  360. }
  361. }
  362. public function leaveOp()
  363. {
  364. $room_id = intval($_GET['room_id']);
  365. if($room_id <= 0) {
  366. return self::outerr(errcode::ErrParamter);
  367. }
  368. $result = room\factory_client::instance()->leave($room_id,session_helper::memberid());
  369. if($result === false) {
  370. Log::record("leave nooooo ".session_helper::memberid());
  371. return self::outerr(errcode::ErrRoom,"退出失败");
  372. }
  373. else {
  374. Log::record("leave ok ".session_helper::memberid());
  375. return self::outsuccess($result);
  376. }
  377. }
  378. public function kickoutOp()
  379. {
  380. $room_id = intval($_GET['room_id']);
  381. $kicks = explode(',', trim($_GET['users']));
  382. if($room_id <= 0 || count($kicks) <= 0 ) {
  383. return self::outerr(errcode::ErrParamter);
  384. }
  385. $item = Model('room')->getRoom($room_id);
  386. if(empty($item)) {
  387. return self::outerr(errcode::ErrParamter,"此群不存在");
  388. }
  389. $info = new room\room_info($item);
  390. if($info->owner() != session_helper::memberid()) {
  391. return self::outerr(errcode::ErrTalk,"只有群主可以踢人");
  392. }
  393. $result = room\factory_client::instance()->kickout($room_id,session_helper::memberid(),$kicks);
  394. if($result === false) {
  395. return self::outerr(errcode::ErrRoom);
  396. }
  397. else {
  398. return self::outsuccess($result);
  399. }
  400. }
  401. ///////////群详情设置/////////////////////////////////////////////////////////////////////////////////////////////////
  402. /**
  403. * 会话详情页 talk_type:room/chatwo talk_id:room_id/user
  404. */
  405. public function room_detailOp()
  406. {
  407. $talk_type = trim($_GET['talk_type']);
  408. $talk_id = intval($_GET['talk_id']);
  409. $relay_id = intval($_GET['relay_id']);
  410. if($talk_id <= 0) {
  411. return self::outerr(errcode::ErrParamter);
  412. }
  413. $user = session_helper::memberid();
  414. $param = ["talk_type" => $talk_type, "talk_id" => $talk_id , "member_id" => $user,"room_name"=>"","relay_id"=>$relay_id];
  415. if($talk_type == "room")
  416. {
  417. $room_id = $talk_id;
  418. try {
  419. $tpl = new room\tpl_group_home($user,$talk_id,$relay_id);
  420. $room_name = $tpl->get_room_info()->name();
  421. $param["room_name"] = $room_name;
  422. return self::outsuccess(['tpl' => $tpl,"param" => $param],'talk/homepage_room');
  423. } catch (Exception $ex) {
  424. Log::record("member_talk.room_detail error: room_id={$room_id} user={$user}",Log::ERR);
  425. return self::outerr(errcode::ErrParamter);
  426. }
  427. }
  428. elseif($talk_type == 'chatwo')
  429. {
  430. $other = $talk_id;
  431. try {
  432. $tpl = new room\tpl_chatwo_home($user,$other);
  433. return self::outsuccess(['tpl' => $tpl,"param"=>$param],'talk/homepage_chatwo');
  434. } catch (Exception $ex) {
  435. Log::record("member_talk.room_detail error: other={$other} user={$user}",Log::ERR);
  436. return self::outerr(errcode::ErrParamter);
  437. }
  438. }
  439. else
  440. {
  441. return self::outerr(errcode::ErrParamter);
  442. }
  443. }
  444. /**
  445. * 修改群名称和群描述 room_id room_name room_desc
  446. */
  447. public function room_editOp()
  448. {
  449. $room_id = intval($_GET['room_id']);
  450. if(empty($room_id)) {
  451. return self::outerr(errcode::ErrParamter);
  452. }
  453. $updata = [];
  454. if(!empty($_GET['room_name'])){
  455. $updata["room_name"] = trim($_GET['room_name']);
  456. }
  457. if(!empty($_GET['room_desc'])){
  458. $updata["room_desc"] = trim($_GET['room_desc']);
  459. if(strlen($updata["room_desc"]) > 180 ) return self::outerr(errcode::ErrParamter,"群介绍过长");
  460. }
  461. if(empty($updata)) {
  462. return self::outerr(errcode::ErrParamter);
  463. }
  464. $ret = Model('room')->editRoom(['room_id'=>$room_id],$updata);
  465. if($ret) {
  466. room\factory_client::instance()->change($room_id);
  467. return self::outsuccess(null);
  468. } else {
  469. return self::outerr(errcode::ErrDB);
  470. }
  471. }
  472. /**
  473. * 设置群内昵称 room_id member_nick
  474. */
  475. public function change_membernickOp()
  476. {
  477. $room_id = intval($_GET['room_id']);
  478. if($room_id <= 0) {
  479. return self::outerr(errcode::ErrParamter);
  480. }
  481. $member_nick = trim($_GET['member_nick']);
  482. $len = strlen($member_nick);
  483. if( $len <= 0 || $len > 40 ) {
  484. return self::outerr(errcode::ErrParamter,"群备注名称不得为空或过长");
  485. }
  486. $user = intval($_GET['user']);
  487. $self = session_helper::memberid();
  488. $mod_room = Model('room');
  489. if($user <= 0)
  490. {
  491. $ret = $mod_room->editRoomParts(['room_id' => $room_id,'member_id' => $self],['member_nick' => $member_nick]);
  492. }
  493. else
  494. {
  495. $item = $mod_room->getRoom($room_id);
  496. if(empty($item)) {
  497. return self::outerr(errcode::ErrParamter);
  498. }
  499. $info = new room\room_info($item);
  500. if($info->owner() != $self) {
  501. return self::outerr(errcode::ErrTalk,"只有管理员可以修改他人的备注");
  502. }
  503. $ret = $mod_room->editRoomParts(['room_id' => $room_id,'member_id' => $user],['member_nick' => $member_nick]);
  504. }
  505. if($ret) {
  506. room\factory_client::instance()->change($room_id);
  507. return self::outsuccess(null);
  508. } else {
  509. return self::outerr(errcode::ErrDB);
  510. }
  511. }
  512. /**
  513. * 设置群头像 room_id file_path
  514. */
  515. public function change_room_avatarOp()
  516. {
  517. $room_id = intval($_POST['room_id']);
  518. $upload_dir = 'room/avatars/';
  519. $uploader = new room\uploader();
  520. $res = $uploader->upfile($upload_dir,$info);
  521. if($res == false) {
  522. return self::outerr(errcode::ErrUploadFileFailed);
  523. }
  524. $file_name = $info['msg'];
  525. $file_path = '/data/upload/'.$upload_dir . $file_name.'?tm='.time();
  526. $ret = Model("room")->editRoom(['room_id' => $room_id],['avatar' => $file_path]);
  527. if ($ret) {
  528. room\factory_client::instance()->change($room_id);
  529. return self::outsuccess(['avatar' => $file_path]);
  530. } else {
  531. return self::outerr(errcode::ErrDB);
  532. }
  533. }
  534. /**
  535. * 转让管理员
  536. * 将 room_id 转让给 to_user
  537. */
  538. public function change_room_ownerOp()
  539. {
  540. $room_id = intval($_GET['room_id']);
  541. $to_user = explode(',', trim($_GET['room_owner']));
  542. $to_user = $to_user[0];
  543. $from_user = session_helper::memberid();
  544. $mod_room = Model("room");
  545. $item = $mod_room->getRoomParts(["room_id"=>$room_id,"member_id"=>$from_user,"state"=>0]);
  546. if(empty($item)) {
  547. return self::outerr(errcode::ErrMemberNotExist,"不是群主不可移交管理员");
  548. }
  549. $item = $mod_room->getRoomParts(["room_id"=>$room_id,"member_id"=>$to_user,"state"=>0]);
  550. if(empty($item)) {
  551. return self::outerr(errcode::ErrMemberNotExist,"用户已不在群中");
  552. }
  553. $member = new member_info($to_user);
  554. $info = $member->filter();
  555. $name = $info['nickname'];
  556. ///
  557. $trans = new trans_wapper(null,__METHOD__);
  558. $exchange = $this->exchage_room_owner($room_id,$from_user,$to_user);
  559. $editres = $mod_room->editRoom(['room_id' => $room_id],['room_owner' => $to_user,"owner_name"=>$name]);
  560. if($exchange && $editres){
  561. $trans->commit();
  562. return self::outsuccess("移交成功");
  563. }else{
  564. $trans->rollback();
  565. return self::outerr(errcode::ErrTalk,"移交失败");
  566. }
  567. }
  568. private function exchage_room_owner($room_id,$from_user,$to_user)
  569. {
  570. $mod_room = Model("room");
  571. $update1 = $mod_room->editRoomParts(['room_id' => $room_id,'member_id' => $from_user],['type' => 0]);
  572. $update2 = $mod_room->editRoomParts(['room_id' => $room_id,'member_id' => $to_user] ,['type' => 1]);
  573. return $update1 && $update2;
  574. }
  575. /**
  576. * 设置群公告 room_id room_notice
  577. */
  578. public function change_room_noticeOp()
  579. {
  580. $room_id = intval($_GET['room_id']);
  581. if($room_id <= 0) {
  582. return self::outerr(errcode::ErrParamter);
  583. }
  584. $room_notice = trim($_GET['room_notice']);
  585. $len = strlen($room_notice);
  586. if( $len <= 0 || $len > 450 ) {
  587. return self::outerr(errcode::ErrParamter,"公告过长或为空");
  588. }
  589. $mod_room = Model('room');
  590. $item = $mod_room->getRoom($room_id);
  591. if(empty($item)) {
  592. return self::outerr(errcode::ErrParamter,"错误的群信息");
  593. }
  594. $user = session_helper::memberid();
  595. $info = new room\room_info($item);
  596. if($info->owner() != $user) {
  597. return self::outerr(errcode::ErrTalk,"只有管理员可以修改群公告");
  598. }
  599. $ret = Model("room")->editRoom(['room_id' => $room_id],['notice' => $room_notice]);
  600. if($ret) {
  601. return self::outsuccess(null);
  602. } else {
  603. return self::outerr(errcode::ErrDB);
  604. }
  605. }
  606. /**
  607. * 设置群密码 room_id passwd use_pass(开启或关闭)
  608. */
  609. public function change_passwdOp(){
  610. $room_id = intval($_GET['room_id']);
  611. $use_pass = intval($_GET['use_pass']);
  612. if($room_id <= 0) {
  613. return self::outerr(errcode::ErrParamter);
  614. }
  615. if($use_pass)
  616. {
  617. $passwd = strtolower(trim($_GET['passwd']));
  618. $len = strlen($passwd);
  619. if($len <4 || $len >8) {
  620. return self::outerr(errcode::ErrParamter,"密码长度请再4至8个字符之间");
  621. }
  622. if (!preg_match("/^[a-z0-9]+$/u", $passwd)) {
  623. return self::outerr(errcode::ErrParamter,"密码只能包含英文字母或数字,不区分大小写");
  624. }
  625. }else{
  626. $passwd = "";
  627. }
  628. $mod_room = Model('room');
  629. $item = $mod_room->getRoom($room_id);
  630. if(empty($item)) {
  631. return self::outerr(errcode::ErrParamter,"错误的群信息");
  632. }
  633. $user = session_helper::memberid();
  634. $info = new room\room_info($item);
  635. if($info->owner() != $user) {
  636. return self::outerr(errcode::ErrTalk,"只有管理员可以修改群密码");
  637. }
  638. $ret = Model("room")->editRoom(['room_id' => $room_id],['passwd' => $passwd]);
  639. if($ret) {
  640. return self::outsuccess(null);
  641. } else {
  642. return self::outerr(errcode::ErrDB);
  643. }
  644. }
  645. /**
  646. * 清空聊天记录 room_id
  647. */
  648. public function hide_msgOp()
  649. {
  650. $room_id = intval($_GET['room_id']);
  651. $user = session_helper::memberid();
  652. if($room_id < 0) {
  653. return self::outerr(errcode::ErrParamter);
  654. }
  655. $mod_room = Model('room');
  656. $hide_msg = 0;
  657. $cond = ["room_id"=>$room_id, "member_id"=>$user, "state" => 0];
  658. $item = $mod_room->getRoomParts($cond,"hide_msg",1);
  659. if(!empty($item)) {
  660. $hide_msg = $item[0]['hide_msg'];
  661. }
  662. $cur_msg = 0;
  663. $item = $mod_room->getRoomsgList(["msg_type"=>0,"room_id"=>$room_id],1,'msg_id');
  664. if(!empty($item)) {
  665. $cur_msg = $item[0]['msg_id'];
  666. }
  667. if($cur_msg <= $hide_msg) {
  668. return self::outerr(errcode::ErrTalk,"无历史记录可清除");
  669. }
  670. $update = $mod_room->editRoomParts($cond,["hide_msg"=>$cur_msg]);
  671. if($update) {
  672. return self::outsuccess(null,"清除成功");
  673. } else {
  674. return self::outerr(errcode::ErrTalk,"清除失败");
  675. }
  676. }
  677. ///////////////////群运动///////////////////////////////////////////////////////////////////////////////////
  678. /**
  679. * 群运动主页
  680. */
  681. public function steps_homeOp(){
  682. return self::outsuccess(null,'talk/room_steps');
  683. }
  684. public function room_stepsOp()
  685. {
  686. try
  687. {
  688. $room_id = intval($_GET['room_id']);
  689. $mod_room = Model('room');
  690. $userid = session_helper::memberid();
  691. $room = $mod_room->getRoomParts(["room_id"=>$room_id,"member_id"=>$userid,"state"=>0],'room_id,member_id,steps',1);
  692. if(empty($room)) return self::outerr(errcode::ErrParamter,"错误的群信息");
  693. $user_steps = $this->user_steps($room[0]);
  694. $steps = [];
  695. $hasmore = false;
  696. $per_page = 20;
  697. $items = $mod_room->getRoomParts(["room_id"=>$room_id,"state"=>0],'member_id,steps,bonus',$per_page,"steps desc,FIELD(`member_id`,{$userid}) desc");
  698. if(!empty($items))
  699. {
  700. foreach ($items as $k => $sport)
  701. {
  702. $info = new member_info($sport['member_id']);
  703. $member = $info->filter();
  704. $steps[$k]['member_id'] = $sport['member_id'];
  705. $steps[$k]['steps'] = $sport['steps'];
  706. $steps[$k]['avatar'] = $member['avatar'];
  707. $steps[$k]['is_man'] = $member['is_man'];
  708. $steps[$k]['nickname'] = util::ellipsis($member['nickname']);
  709. $steps[$k]['bonus'] = $sport['bonus'];
  710. }
  711. if(count($steps) >= $per_page) $hasmore = true;
  712. }
  713. return self::outsuccess(["user"=>$user_steps,"steps"=>$steps,"mobile_page"=>["hasmore"=>$hasmore,"curpage"=>$this->cur_page]]);
  714. } catch (Exception $ex) {
  715. return self::outerr(errcode::ErrParamter);
  716. }
  717. }
  718. private function user_steps($room_parti)
  719. {
  720. $info = new member_info($room_parti['member_id']);
  721. $member = $info->filter();
  722. $user_steps["member_id"] = $member['member_id'];
  723. $user_steps['avatar'] = $member['avatar'];
  724. $user_steps['is_man'] = $member['is_man'];
  725. $user_steps['nickname'] = $member['nickname'];
  726. $user_steps["steps"] = $room_parti['steps'];
  727. $ranks = Model('room')->getRoomParts(["room_id"=>$room_parti['room_id'],"state"=>0,"steps"=>['gt',$room_parti['steps']]],'member_id',false,'steps desc');
  728. $user_steps["ranking"] = count($ranks)+1;
  729. return $user_steps;
  730. }
  731. /**
  732. * 福利社个人运动详情页
  733. */
  734. public function steps_detailOp()
  735. {
  736. $mid = session_helper::memberid();
  737. $info = new member_info($mid);
  738. $member = $info->filter();
  739. $today = strtotime(date('Y-m-d',time()));
  740. $first = $today - 86400 * 6;
  741. $mod_room = Model('room');
  742. $items = $mod_room->roomSteps(["member_id"=>$mid,"date_stamp"=>[['gt',$first-1],['lt',$today+1]]],'*',7);
  743. $steps_info = [];
  744. if(!empty($items)){
  745. foreach ($items as $item){
  746. $steps_info[$item['date_stamp']] = $item;
  747. }
  748. }
  749. $charts = $this->steps_charts($first,$steps_info);
  750. $room_steps = [];
  751. $rooms = $mod_room->getRoomParts(["member_id"=>$mid,"state"=>0],'room_id',false);
  752. if(!empty($rooms))
  753. {
  754. foreach ($rooms as $room) {
  755. $params = $mod_room->getRoom($room['room_id']);
  756. $rinfo = new room\room_info($params);
  757. if($rinfo->type() !== proto_type::room_chat) continue;
  758. $room['avatar'] = $rinfo->avatar();
  759. $name = $rinfo->name();
  760. $room['name'] = util::ellipsis($name);
  761. $room['steps'] = $mod_room->totalRoomSteps($room['room_id']);
  762. $room_steps[] = $room;
  763. }
  764. }
  765. return self::outsuccess([
  766. "background"=>RESOURCE_SITE_URL. "/mobile/talk/images/cover.png",
  767. "avatar"=>$member['avatar'],
  768. "nickname"=>$member['nickname'],
  769. "charts"=>$charts,
  770. "room_steps"=>$room_steps,
  771. "donate_rate"=>self::donate_rate],
  772. 'talk/steps_detail');
  773. }
  774. private function steps_charts($first_date,$steps_info)
  775. {
  776. $charts = [];
  777. for ($i=0; $i<7; $i++ )
  778. {
  779. $key = $first_date + 86400 * $i;
  780. if($i==0){
  781. $month = date('n月',$key);
  782. $charts["month"] = $month;
  783. }
  784. $charts["date"][] = date('d',$key);
  785. if(isset($steps_info[$key])){
  786. $charts["steps"][] = intval($steps_info[$key]['steps']);
  787. }else{
  788. $charts["steps"][] = 0;
  789. }
  790. }
  791. return $charts;
  792. }
  793. /**
  794. * 捐赠步数
  795. */
  796. public function donate_stepsOp()
  797. {
  798. $room_id = intval($_GET['room_id']);
  799. $steps = intval($_GET['steps']);
  800. if($room_id <= 0 || $steps <= 0 ) {
  801. return self::outerr(errcode::ErrParamter,"错误的参数");
  802. }
  803. $user = session_helper::memberid();
  804. $today = strtotime(date('Y-m-d',time()));
  805. $mod_room = Model('room');
  806. $room = $mod_room->getRoomParts(['room_id' => $room_id,"member_id" => $user,"state" => 0],'*',1);
  807. if(empty($room)) {
  808. return self::outerr(errcode::ErrParamter,"您不在此群中");
  809. }
  810. $item = $mod_room->findSteps(['room_id' => $room_id,"member_id" => $user,'date_stamp' => $today]);
  811. if(!empty($item)) {
  812. $mod_room->editSteps(['steps_id' => $item['steps_id']],['steps' => ['exp',"steps + {$steps}"]]);
  813. } else {
  814. $mod_room->addSteps($room_id,$user,$steps,$today);
  815. }
  816. $amount = bcdiv($steps,self::donate_rate,2);
  817. $mod_room->editRoomParts(['room_id' => $room_id,"member_id" => $user,"state" => 0],["steps" => ['exp',"steps + {$steps}"],"bonus" => ['exp',"bonus + {$amount}"]]);
  818. $mod_room->editRoom(['room_id'=>$room_id],['steps_count' => ['exp',"steps_count + {$steps}"], 'shared_bonus' => ['exp',"shared_bonus + {$amount}"]]);
  819. $content = ['user' => session_helper::memberid(),'steps' => $steps,'amount' => $amount];
  820. room\factory_client::instance()->notice_room($room_id,proto_type::msg_stype_donate,$content);
  821. return self::outsuccess(['amount'=>$amount]);
  822. }
  823. ///////////////群认证////////////////////////////////////////////////////////////////////////////////////////
  824. public function room_certificateOp()
  825. {
  826. $type = intval($_GET['ctype']);
  827. $room_id = intval($_GET['talk_id']);
  828. $cert = Model('room')->findCert(['room_id'=>$room_id,"ctype"=>$type]);
  829. if(empty($cert)) $cert = [];
  830. if($type == 1){
  831. return self::outsuccess(['room_id'=>$room_id,"cert"=>$cert],'talk/school_certs');
  832. }elseif($type == 2){
  833. return self::outsuccess(['room_id'=>$room_id,"cert"=>$cert],'talk/enterprise_certs');
  834. }else{
  835. return;
  836. }
  837. }
  838. public function commit_certsOp()
  839. {
  840. $cmobile = intval($_POST['cmobile']);
  841. $code = trim($_POST['code']);
  842. $validator = new Validator();
  843. $validator->setValidate(Validator::verify_mobile($cmobile));
  844. $validator->setValidate(Validator::verify_smscode($code));
  845. $err = $validator->validate();
  846. if ($err != '') {
  847. return self::outerr(errcode::ErrInputParam, $err);
  848. }
  849. $ret = sms_helper::check_code(Sms::register_code,$code,$cmobile);
  850. if(is_array($ret)) {
  851. return self::outerr($ret['code'], $ret['msg']);
  852. }
  853. $ctype = intval($_POST['ctype']);
  854. $room_id = intval($_POST['room_id']);
  855. $short_name = trim($_POST['short_name']);
  856. $full_name = trim($_POST['full_name']);
  857. $cmail = trim($_POST['cmail']);
  858. if(!preg_match('/^([.a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\\.[a-zA-Z0-9_-])+/',$cmail)) {
  859. return self::outerr(errcode::ErrInputParam, "请输入正确的邮箱地址");
  860. }
  861. $cname = trim($_POST['cname']);
  862. $cinfo = trim($_POST['cinfo']);
  863. $cimage = $this->upload_cimage();
  864. if($cimage === false){
  865. return self::outerr(errcode::ErrUploadFileFailed);
  866. }
  867. $mod_room = Model('room');
  868. $item = $mod_room->findCert(["room_id"=>$room_id]);
  869. if(empty($item))
  870. {
  871. $insertId = $mod_room->addCert($ctype,$room_id,$short_name,$full_name,$cname,$cmobile,$cmail,$cinfo,$cimage);
  872. if($insertId){
  873. return self::outsuccess(null);
  874. }else{
  875. return self::outerr(errcode::ErrDB,"提交失败");
  876. }
  877. }
  878. if($item['cstatus'] == 0){
  879. return self::outerr(errcode::ErrTalk,"您已提交一份认证申请,请耐心等待审核,勿重复提交");
  880. }
  881. $updata['ctype'] = $ctype;
  882. $updata['room_id'] = $room_id;
  883. $updata["short_name"] = $short_name;
  884. $updata["full_name"] = $full_name;
  885. $updata["cname"] = $cname;
  886. $updata["cmobile"] = $cmobile;
  887. $updata["cmail"] = $cmail;
  888. $updata["cinfo"] = $cinfo;
  889. $updata["cimage"] = $cimage;
  890. $updata['cstatus'] = 0;
  891. $updata["add_time"] = time();
  892. $update = $mod_room->editCerts(['cert_id'=>$item['cert_id']],$updata);
  893. if($update){
  894. return self::outsuccess(null);
  895. }else{
  896. return self::outerr(errcode::ErrDB,"提交失败");
  897. }
  898. }
  899. private function upload_cimage()
  900. {
  901. $upload_dir = 'room/certs/';
  902. $uploader = new room\uploader();
  903. $res = $uploader->upfile($upload_dir,$info);
  904. if($res) {
  905. return '/data/upload/'.$upload_dir . $info['msg'].'?tm='.time();
  906. } else {
  907. return false;
  908. }
  909. }
  910. ///////////////群基金////////////////////////////////////////////////////////////////////////////////////////
  911. public function share_bonusOp()
  912. {
  913. $room_id = intval($_GET['room_id']);
  914. if($room_id <= 0) {
  915. return self::outerr(errcode::ErrParamter);
  916. }
  917. $mod_room = Model('room');
  918. $room = $mod_room->getRoom($room_id);
  919. if(empty($room)) {
  920. return self::outerr(errcode::ErrParamter,"群信息有误");
  921. }
  922. $parts = new room\room_parts($room_id);
  923. $uids = $parts->allparts();
  924. if(!in_array(session_helper::memberid(),$uids)) {
  925. return self::outerr(errcode::ErrParamter,"不可以偷看别人的共享资金哦");
  926. }
  927. $list = [];
  928. $items = $mod_room->getRoomsgList(["room_id"=>$room_id,"type"=>['in',[proto_type::msg_type_donate,proto_type::msg_type_spend]]]);
  929. if(!empty($items))
  930. {
  931. $uids = [];
  932. foreach ($items as $idx => $item) {
  933. $orgmsg = json_decode($item['orgmsg'],true);
  934. $items[$idx]['amount'] = $orgmsg['amount'];
  935. $items[$idx]['member_id'] = $orgmsg['user'];
  936. $uids[] = $orgmsg['user'];
  937. }
  938. $uids = array_unique($uids);
  939. $info = [];
  940. $members = member_info::get_members($uids);
  941. foreach ($members as $member){
  942. $info[$member['member_id']]['avatar'] = $member['avatar'];
  943. $info[$member['member_id']]['name'] = $member['nickname'];
  944. }
  945. foreach ($items as $val)
  946. {
  947. $uid = $val['member_id'];
  948. $val['avatar'] = $info[$uid]['avatar'];
  949. $val['name'] = $info[$uid]['name'];
  950. $val['msg'] = $val['type'] == proto_type::msg_type_donate ? "+ <span>".$val['amount']."</span>" : "- <span>".$val['amount']."</span>";
  951. $val['state'] = $val['type'] == proto_type::msg_type_donate ? 1:0;
  952. $val['operate'] = $val['type'] == proto_type::msg_type_donate ? "贡献":"消费";
  953. $list[] = $val;
  954. }
  955. }
  956. return self::outsuccess(["room"=>$room,"list" => $list],'talk/share_bonus');
  957. }
  958. //////////////添加好友/////////////////////////////////////////////////////////////////////////////////////////
  959. /**
  960. * 信息输入板
  961. * param $type int 1:群申请 2:好友申请 3:查看/编辑群公告
  962. * @场景type=1 relay_id(二维码扫码 立即入群)
  963. * @场景type=2 talk_id(申请加好友的member_id)
  964. * @场景type=3 talke_id(room_id)
  965. */
  966. public function message_boardOp()
  967. {
  968. $type = intval($_GET['type']);
  969. $talk_id = intval($_GET['talk_id']);
  970. $relay_id = intval($_GET['relay_id']);
  971. $isManager = intval($_GET['isManager']);
  972. if(empty($type)) {
  973. return self::outerr(errcode::ErrParamter,"打开页面失败");
  974. }
  975. $ajax_param["type"] = $type;
  976. switch ($type){
  977. case 1:
  978. $ajax_param["talk_id"] = $talk_id;
  979. $ajax_param["relay_id"] = $relay_id;
  980. break;
  981. case 2:
  982. $ajax_param["talk_id"] = $talk_id;
  983. break;
  984. case 3:
  985. $ajax_param["talk_id"] = $talk_id;
  986. $room = Model('room')->getRoom($talk_id);
  987. $ajax_param['notice'] = isset($room['notice']) ? $room['notice'] : "";
  988. $ajax_param['isManager'] = $isManager;
  989. break;
  990. default:
  991. $ajax_param = [];
  992. }
  993. return self::outsuccess(["ajax_param"=>$ajax_param],'talk/message_board');
  994. }
  995. public function add_friendsOp()
  996. {
  997. $user = intval($_GET['user']);
  998. $msg = trim($_GET['msg']);
  999. if($user <= 0 ){
  1000. return self::outerr(errcode::ErrRelation,"发送失败");
  1001. }
  1002. $relateion = new relation\mem_relation(session_helper::memberid());
  1003. $isfriend = $relateion->is_friends($user);
  1004. if($isfriend == false) {
  1005. $relateion->subscribe($user);
  1006. room\pusher::instance()->apply_friend(session_helper::memberid(),$user,$msg);
  1007. }
  1008. return self::outsuccess(null);
  1009. }
  1010. public function friends_applyOp()
  1011. {
  1012. return self::outsuccess(null,'talk/friends_apply');
  1013. }
  1014. public function ajax_friends_applyOp()
  1015. {
  1016. $mod_room = Model('room');
  1017. $member = session_helper::memberid();
  1018. $hasmore = false;
  1019. $per_page = 20;
  1020. $applys = $mod_room->roomApplys(['room_id'=>0,'viewer'=>$member],"*",$per_page);
  1021. if(!empty($applys)){
  1022. foreach ($applys as $k => $apply){
  1023. $info = new member_info($apply['member_id']);
  1024. $member = $info->filter();
  1025. $applys[$k]['avatar'] = $member['avatar'];
  1026. $applys[$k]['is_man'] = $member['is_man'];
  1027. $applys[$k]['nickname'] = $member['nickname'];
  1028. $applys[$k]['step_msg'] = $this->step_to_str($apply['step']);
  1029. }
  1030. if(count($applys) >= $per_page) $hasmore = true;
  1031. }
  1032. return self::outsuccess(["applys"=>$applys,"mobile_page"=>["hasmore"=>$hasmore,"curpage"=>$this->cur_page]]);
  1033. }
  1034. public function new_applysOp(){
  1035. return self::outsuccess(null,'talk/new_applys');
  1036. }
  1037. public function ajax_get_applysOp()
  1038. {
  1039. $mod_room = Model('room');
  1040. $member = session_helper::memberid();
  1041. $items = $mod_room->getRoomsgList(['member_id'=>$member,"type" => proto_type::msg_type_apply],$this->page_size());
  1042. if(!empty($items))
  1043. {
  1044. foreach ($items as $k => $apply) {
  1045. $orgmsg = json_decode($apply['orgmsg'],true);
  1046. $items[$k]['type'] = $orgmsg['type'];
  1047. $items[$k]['userid'] = $orgmsg['from']['userid'];
  1048. $items[$k]['nickname'] = $orgmsg['from']['nickname'];
  1049. $items[$k]['avatar'] = $orgmsg['from']['avatar'];
  1050. $items[$k]['content'] = $orgmsg['note'];
  1051. $items[$k]['state'] = $this->state_to_str($orgmsg['state']);
  1052. $items[$k]['step'] = $this->state_to_step($orgmsg['state']);
  1053. }
  1054. $hasmore = count($items) < $this->page_size() ? false : true;
  1055. }
  1056. else {
  1057. $hasmore = false;
  1058. }
  1059. return self::outsuccess(["applys"=>$items,"mobile_page" => ["hasmore" => $hasmore,"curpage" => $this->page_no()]]);
  1060. }
  1061. /////////////////申请入群///////////////////////////////////////////////////////////////////////////////////////////
  1062. public function send_applyOp()
  1063. {
  1064. $room_id = intval($_GET['room_id']);
  1065. $relay_id = intval($_GET['relay_id']);
  1066. if($room_id <= 0) {
  1067. return self::outerr(errcode::ErrParamter,"请求失败");
  1068. }
  1069. $member = session_helper::memberid();
  1070. $mod_room = Model('room');
  1071. $room = $mod_room->getRoom($room_id);
  1072. if(empty($room)) {
  1073. return self::outerr(errcode::ErrParamter,"房间不存在");
  1074. }
  1075. $isFromQr = false;
  1076. if($relay_id > 0) {
  1077. $parts = new room\room_parts($room_id);
  1078. $uids = $parts->allparts();
  1079. $isFromQr = in_array($relay_id,$uids) ? true : false;
  1080. }
  1081. $pwd = $room['passwd'];
  1082. $owner = $room['room_owner'];
  1083. $inviter = $isFromQr ? $relay_id : $owner;
  1084. if(empty($pwd) || $isFromQr) {
  1085. //立即入群
  1086. $ret = room\factory_client::instance()->invite($room_id,$inviter,[$member]);
  1087. if($ret === false) {
  1088. return self::outerr(errcode::ErrRoom,"进群失败");
  1089. }
  1090. else
  1091. {
  1092. $members = member_info::get_members($ret['newusers']);
  1093. $result['invitees'] = $members;
  1094. return self::outsuccess($result);
  1095. }
  1096. }
  1097. elseif(intval($_GET['apply'] == 1))
  1098. {
  1099. //发送入群申请
  1100. $msg = trim($_GET['msg']);
  1101. if(strlen($msg) >= 100){
  1102. return self::outerr(errcode::ErrParamter,"入群申请过长,请缩短一些");
  1103. }
  1104. $add = $mod_room->addApply($room_id,$member,$msg);
  1105. if($add){
  1106. return self::outsuccess(null,"申请成功");
  1107. } else {
  1108. return self::outerr(errcode::ErrDB,"提交失败");
  1109. }
  1110. }else {
  1111. if(strtolower(trim($_GET['passwd'])) !== strtolower($pwd)) {
  1112. return self::outerr(errcode::ErrParamter, "群密码有误");
  1113. }
  1114. $ret = room\factory_client::instance()->invite($room_id,$owner,[$member]);
  1115. if($ret === false) {
  1116. return self::outerr(errcode::ErrRoom, "进群失败");
  1117. }
  1118. $members = member_info::get_members($ret['newusers']);
  1119. $result['invitees'] = $members;
  1120. return self::outsuccess($result);
  1121. }
  1122. }
  1123. public function pass_applyOp()
  1124. {
  1125. $apply = intval($_GET['apply_id']);
  1126. $step = intval($_GET['step']);
  1127. $type = intval($_GET['type']); // 1:申请入群 2:申请好友
  1128. $member = session_helper::memberid();
  1129. if($apply <=0 || $step <=0 || $step >2 || $type <=0 || $type >2) {
  1130. return self::outerr(errcode::ErrParamter,"请求失败");
  1131. }
  1132. $mod_room = Model('room');
  1133. if($type == 1){
  1134. $pass = $this->pass_room($mod_room,$apply,$member,$step);
  1135. } else {
  1136. $pass = $this->pass_friends($mod_room,$apply,$member,$step);
  1137. }
  1138. if(!$pass) {
  1139. return self::outerr(errcode::ErrTalk,"网络错误");
  1140. }
  1141. $edit = $mod_room->editApply($apply,$member,$step);
  1142. if($edit){
  1143. return self::outsuccess(null,"操作成功");
  1144. }else{
  1145. return self::outerr(errcode::ErrDB,"提交失败");
  1146. }
  1147. }
  1148. private function pass_room($mod_room,$apply,$viewer,$step)
  1149. {
  1150. if($step == 1)
  1151. {
  1152. $item = $mod_room->findApply($apply);
  1153. $ret = room\factory_client::instance()->invite($item["room_id"],$viewer,[$item['member_id']]);
  1154. if($ret === false)
  1155. {
  1156. return false;
  1157. }
  1158. } else
  1159. {
  1160. //todo refuse notice
  1161. }
  1162. return true;
  1163. }
  1164. private function pass_friends($mod_room,$apply,$viewer,$step)
  1165. {
  1166. if($step == 1) {
  1167. $item = $mod_room->findApply($apply);
  1168. }
  1169. else
  1170. {
  1171. //todo refuse notice
  1172. }
  1173. return true;
  1174. }
  1175. public function room_applysOp(){
  1176. return self::outsuccess(null,'talk/room_apply');
  1177. }
  1178. public function ajax_room_applyOp()
  1179. {
  1180. $room_id = intval($_GET['room_id']);
  1181. if($room_id <= 0){
  1182. return self::outerr(errcode::ErrParamter,"缺少必要参数");
  1183. }
  1184. $mod_room = Model('room');
  1185. $item = $mod_room->getRoom($room_id);
  1186. if(empty($item)) {
  1187. return self::outerr(errcode::ErrParamter,"错误的群信息");
  1188. }
  1189. $member = session_helper::memberid();
  1190. $info = new room\room_info($item);
  1191. Log::record("room:{$room_id} user:$member",Log::DEBUG);
  1192. if($info->owner() != $member) {
  1193. return self::outerr(errcode::ErrTalk,"只有管理员可以查看申请列表");
  1194. }
  1195. $hasmore = false;
  1196. $per_page = 20;
  1197. $applys = $mod_room->roomApplys(['room_id' => $room_id],"*",$per_page);
  1198. if(!empty($applys)){
  1199. foreach ($applys as $k => $apply){
  1200. $info = new member_info($apply['member_id']);
  1201. $member = $info->filter();
  1202. $applys[$k]['avatar'] = $member['avatar'];
  1203. $applys[$k]['is_man'] = $member['is_man'];
  1204. $applys[$k]['nickname'] = $member['nickname'];
  1205. $applys[$k]['step_msg'] = $this->step_to_str($apply['step']);
  1206. }
  1207. if(count($applys) >= $per_page) $hasmore = true;
  1208. }
  1209. return self::outsuccess(["applys"=>$applys,"mobile_page"=>["hasmore"=>$hasmore,"curpage"=>$this->cur_page]]);
  1210. }
  1211. private function step_to_str($step)
  1212. {
  1213. switch ($step){
  1214. case '0': return "申请中";
  1215. case '1': return "已接受";
  1216. case '2': return "已拒绝";
  1217. default : return "申请中";
  1218. }
  1219. }
  1220. private function state_to_str($state){
  1221. switch ($state){
  1222. case 'pending': return "申请中";
  1223. case '1': return "已接受";
  1224. case '2': return "已拒绝";
  1225. default : return "申请中";
  1226. }
  1227. }
  1228. private function state_to_step($state){
  1229. switch ($state){
  1230. case 'pending': return 0;
  1231. case '1': return "已接受";
  1232. case '2': return "已拒绝";
  1233. default : return "申请中";
  1234. }
  1235. }
  1236. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1237. public function room_goodsOp()
  1238. {
  1239. $room_id = intval($_GET['talk_id']);
  1240. if( $room_id <= 0 ) {
  1241. return self::outerr(errcode::ErrParamter,"参数有误");
  1242. }
  1243. $mod_room = Model('room');
  1244. $items = $mod_room->getRoomsgList(["room_id"=>$room_id,"type"=>proto_type::msg_type_goods],20);
  1245. $gids = [];
  1246. foreach ($items as $item) {
  1247. $goods_id = intval($item['orgmsg']);
  1248. if($goods_id > 0) $gids[] = $goods_id;
  1249. }
  1250. $goods = [];
  1251. if(!empty($gids)) {
  1252. $gids = array_unique($gids);
  1253. $helper = new goods_helper($this->price_calcer());
  1254. $order = "field(goods_id,".implode(',',$gids).") asc";
  1255. $goods = $helper->get_infos($gids,0,$order);
  1256. }
  1257. return self::outsuccess( ["goods" => $goods] ,"/talk/room_goods");
  1258. }
  1259. /////
  1260. public function del_fiendsOp()
  1261. {
  1262. $userid = intval($_GET['userid']);
  1263. try
  1264. {
  1265. if(relation_helper::is_follow(session_helper::memberid(),$userid))
  1266. {
  1267. if(relation_helper::onUnSubscribe(session_helper::memberid(),$userid) == true) {
  1268. return self::outsuccess(NULL);
  1269. } else{
  1270. return self::outerr(errcode::ErrRelation,"取消好友关注失败");
  1271. }
  1272. }
  1273. else
  1274. {
  1275. }
  1276. } catch (Exception $ex) {
  1277. return self::outerr(errcode::ErrRelation,"取消好友关注失败");
  1278. }
  1279. }
  1280. }