member_talk.php 47 KB

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