member_talk.php 46 KB

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