member_talk.php 49 KB

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