mAccaddr = $config['access_addr'];
}
public function authonOp()
{
$result = [];
$result['addr'] = $this->mAccaddr;
$result['token'] = room\author::sign_native(session_helper::memberid());
$result['user'] = session_helper::memberid();
return self::outsuccess($result);
}
public function talksOp()
{
$talks_helper = new room\talks_helper();
$input = base64_decode($_POST['cmp_table']);
$result = $talks_helper->talks(session_helper::memberid(),$input);
return self::outsuccess($result);
}
public function friendsOp()
{
$talks_helper = new room\talks_helper();
$friends = $talks_helper->friends(session_helper::memberid());
$members = member_info::get_members($friends);
usort($members,['member_info','alpha_compare']);
$uids = [];
$mem_desc = [];
foreach ($members as $member) {
if($member['member_id'] == session_helper::memberid()) continue;
$uids[] = $member['member_id'];
$mem_desc[] = $member;
}
return self::outsuccess(['friends' => $uids,
'count' => count($uids),
'mem_desc' => $mem_desc,
'mobile_page' => mobile_page(1)]);
}
public function msgsOp()
{
$msgid = intval($_GET['msgid']);
$type = $_GET['type'];
if($msgid == 0 || empty($type)) {
return self::outerr(errcode::ErrParamter);
}
if($msgid < 0) {
$msgid = self::max_msgid;
}
$user_count = 0;
if($type == 'room')
{
$room_id = intval($_GET['room']);
if($room_id <= 0) {
return self::outerr(errcode::ErrParamter);
}
$result = $this->roomsg($msgid,$room_id);
$msgs = $this->format_message($result['uids'],$result['msgs'],$type,0,$room_id);
$parts = new room\room_parts($room_id);
$user_count = $parts->users();
}
elseif($type == 'chatwo')
{
$user = intval($_GET['user']);
if($user <= 0) {
return self::outerr(errcode::ErrParamter);
}
$result = $this->chatwomsg($msgid,$user);
$msgs = $this->format_message($result['uids'],$result['msgs'],$type,$user);
}
else
{
$msgs = [];
Log::record(__METHOD__ . " : invalid type={$type}.",Log::ERR);
}
return self::outsuccess(["msgs" => $msgs,'users' => $user_count]);
}
private function format_message($uids,$msgs,$type,$other=0,$room_id=0)
{
$members = [];
if(!empty($uids))
{
$room_members = Model('room')->getRoomParts(["room_id"=>$room_id],'member_id,member_nick',false);
$nicknames = [];
if(!empty($room)) {
foreach ($room_members as $room_member){
$nicknames[$room_member['member_id']] = $room_member['member_nick'];
}
}
$items = Model('member')->getMemberList(['member_id' => ['in',$uids]]);
foreach ($items as $item)
{
try
{
$info = new member_info($item);
$val = [];
$mid = $info->member_id();
$nickname = empty($nicknames[$mid]) ? $info->nickname() : $nicknames[$mid];
$val['avatar'] = $info->avatar();
$val['nickname'] = $nickname;
$val['userid'] = $mid;
$members[$mid] = $val;
}
catch (Exception $ex) {
Log::record($ex->getMessage(),Log::ERR);
}
}
}
$result = [];
if(!empty($msgs))
{
foreach ($msgs as $msg)
{
$msgtype = proto_type::from_msgtype(intval($msg['type']));
if($msgtype == false) continue;
$val = [];
$val["act"] = $type;
$val["op"] = "message";
$val["msgtype"] = "message";
$from = intval($msg['member_id']);
$member = $members[$from];
if($type == 'room') {
$val["room"] = intval($msg['room_id']);
}
elseif($type == 'chatwo')
{
$val['from'] = $from;
if($from == session_helper::memberid()) {
$val['to'] = $other;
}
else {
$val['to'] = session_helper::memberid();
}
}
else {
}
$val['content'] = ['msgid' => intval($msg['msg_id']), 'from' => $member,'type' => $msgtype,'content' => $msg['msg'],'send_time' => intval($msg['add_time'])];
$result[] = $val;
}
}
return $result;
}
private function roomsg($msgid,$room_id)
{
$user = session_helper::memberid();
$mod_room = Model('room');
$room = $mod_room->getRoomParts(["room_id"=>$room_id, "member_id"=>$user, "state" => 0],"hide_msg",1);
if(!empty($room)){
$hide_msg = intval($room[0]["hide_msg"]);
}else{
return ['uids' => [],'msgs' => []];
}
$msgs = $mod_room->getRoomsgList(['room_id' => $room_id,'msg_id' => [['gt',$hide_msg],['lt',$msgid]],'msg_type' => 0], $this->page_size);
$uids = [];
if($msgs)
{
usort($msgs,['room\sorter','msgid_asc']);
foreach ($msgs as $msg) {
$uids[] = intval($msg['member_id']);
}
$uids = array_unique($uids);
}
return ['uids' => $uids,'msgs' => $msgs];
}
private function chatwomsg($msgid,$user)
{
$mod_room = Model('room');
$left = session_helper::memberid();
$right = $user;
$chat_id = $mod_room->findChatid($left,$right);
if($chat_id == false) {
return ['uids' => [$left,$right],'msgs' => []];
}
$msgs = $mod_room->getRoomsgList(['room_id' => $chat_id,'msg_id' => ['lt',$msgid],'msg_type' => 1], $this->page_size);
if($msgs){
usort($msgs,['room\sorter','msgid_asc']);
}
return ['uids' => [$left,$right],'msgs' => $msgs];
}
public function create_roomOp()
{
$creator = session_helper::memberid();
$result = room\factory_client::instance()->create_chat($creator);
if($result == false) {
return self::outerr(errcode::ErrRoom,"建群失败");
}
$room_id = $result['room'];
if(!empty($_GET['invitees']))
{
$invitees = explode(',', trim($_GET['invitees']));
if(!empty($invitees) && $room_id > 0)
{
$_invitees = array_values(array_diff($invitees,[$creator]));
$ret = room\factory_client::instance()->invite($room_id,$creator,$_invitees);
if($ret == false) return self::outerr(errcode::ErrRoom,"邀请失败");
if(in_array($creator,$invitees)){
$userNum = count($invitees);
}else{
$userNum = count($invitees) + 1;
}
return self::outsuccess(["room_id"=>$room_id,"room_name" => "群聊"]);
}else {
return self::outerr(errcode::ErrRoom,"建群失败");
}
}
else {
return self::outsuccess(["room_id"=>$room_id,"room_name"=>"群聊"]);
}
}
////////////面对面建群////////////////////////////////////////////////////////////////////////////////////////////////
private function face_param(&$err)
{
$code = trim($_GET['code']);
$loc = $this->parase_location($_GET['coordinate']);
if(empty($code) || strlen($code) != 4 || !is_numeric($code)) {
$err = ['code' => errcode::ErrParamter,'msg' => "请输入4位密码"];
return false;
}
if($loc == false) {
$err = ['code' => errcode::ErrParamter,'msg' => "需要地理位置信息才能面对面建群"];
return false;
}
$geo = new geohash();
$hash = $geo->encode($loc['lat'],$loc['lng']);
$hash = substr($hash, 0, 7);
Log::record("loc={$_GET['coordinate']},code = {$code} hash={$hash}",Log::DEBUG);
return ['code' => $code,'lochash' => $hash];
}
public function find_faceOp()
{
$params = $this->face_param($err);
if($params == false) {
return self::outerr($err['code'],$err['msg']);
}
$code = $params['code'];
$lochash = $params['lochash'];
$face = new room\face_room($code,$lochash);
$uids = $face->find(session_helper::memberid());
if($uids === false) {
return self::outerr(errcode::ErrRoomTwoFace,"面对面建群失败");
}
if(!empty($uids)) {
$members = member_info::get_members($uids);
} else {
$members = [];
}
return self::outsuccess(['members' => $members]);
}
public function join_faceOp()
{
$params = $this->face_param($err);
if($params == false) {
return self::outerr($err['code'],$err['msg']);
}
$code = $params['code'];
$lochash = $params['lochash'];
$face = new room\face_room($code,$lochash);
$room_id = $face->join(session_helper::memberid());
if($room_id === false) {
return self::outerr(errcode::ErrRoomTwoFace,"面对面建群失败");
}
$ret = room\factory_client::instance()->invite($room_id,$this->room_creator($room_id),[session_helper::memberid()]);
if($ret === false) {
return self::outerr(errcode::ErrRoom,"进群失败");
}
else
{
$mod_room = Model('room');
$room = $mod_room->getRoom($room_id);
$info = new room\room_info($room);
$result['name'] = $info->name();
return self::outsuccess(['result' => $ret]);
}
}
public function leave_faceOp()
{
$params = $this->face_param($err);
if($params == false) {
return self::outerr($err['code'],$err['msg']);
}
$code = $params['code'];
$lochash = $params['lochash'];
$face = new room\face_room($code,$lochash);
$face->leave(session_helper::memberid());
return self::outsuccess(['result' => "true"]);
}
private function parase_location($location)
{
if(empty($location)) return false;
$pos = explode(',',$location);
if(count($pos) == 2) {
return ['lat' => $pos[0],'lng' => $pos[1]];
} else {
return false;
}
}
///////////群内成员管理//////////////////////////////////////////////////////////////////////////////////////////////
private function room_creator($room_id)
{
$mod_room = Model('room');
$params = $mod_room->getRoom($room_id);
$rinfo = new room\room_info($params);
return $rinfo->creator();
}
public function room_usersOp()
{
$room_id = intval($_GET['room_id']);
if($room_id <= 0) {
return self::outerr(errcode::ErrParamter);
}
$parts = new room\room_parts($room_id);
$uids = $parts->allparts([session_helper::memberid()]);
$members = member_info::get_members($uids);
return self::outsuccess([
'friends' => $uids,
'count' => count($uids),
"mem_desc" => $members,
'mobile_page' => mobile_page(1)]);
}
public function inviteOp()
{
$room_id = intval($_GET['room_id']);
$invitees = explode(',', trim($_GET['invitees']));
if(empty($invitees) || $room_id <= 0) {
return self::outerr(errcode::ErrParamter);
}
$inviter = session_helper::memberid();
$_invitees = array_values(array_diff($invitees,[$inviter]));
$result = room\factory_client::instance()->invite($room_id,$inviter,$_invitees);
if($result === false) {
return self::outerr(errcode::ErrRoom,"邀请失败");
}
else
{
$members = member_info::get_members($result['newusers']);
$result['invitees'] = $members;
return self::outsuccess($result);
}
}
public function leaveOp()
{
$room_id = intval($_GET['room_id']);
if($room_id <= 0) {
return self::outerr(errcode::ErrParamter);
}
$result = room\factory_client::instance()->leave($room_id,session_helper::memberid());
if($result === false) {
Log::record("leave nooooo ".session_helper::memberid());
return self::outerr(errcode::ErrRoom,"退出失败");
}
else {
Log::record("leave ok ".session_helper::memberid());
return self::outsuccess($result);
}
}
public function kickoutOp()
{
$room_id = intval($_GET['room_id']);
$kicks = explode(',', trim($_GET['users']));
if($room_id <= 0 || count($kicks) <= 0 ) {
return self::outerr(errcode::ErrParamter);
}
$item = Model('room')->getRoom($room_id);
if(empty($item)) {
return self::outerr(errcode::ErrParamter,"此群不存在");
}
$info = new room\room_info($item);
if($info->owner() != session_helper::memberid()) {
return self::outerr(errcode::ErrTalk,"只有群主可以踢人");
}
$result = room\factory_client::instance()->kickout($room_id,session_helper::memberid(),$kicks);
if($result === false) {
return self::outerr(errcode::ErrRoom);
}
else {
room\pusher::instance()->kick_room($room_id,session_helper::memberid());
return self::outsuccess($result);
}
}
///////////群详情设置/////////////////////////////////////////////////////////////////////////////////////////////////
/**
* 修改群名称和群描述 room_id room_name room_desc
*/
public function room_editOp()
{
$room_id = intval($_GET['room_id']);
if(empty($room_id)) {
return self::outerr(errcode::ErrParamter);
}
$updata = [];
if(!empty($_GET['room_name'])){
$updata["room_name"] = trim($_GET['room_name']);
}
if(!empty($_GET['room_desc'])){
$updata["room_desc"] = trim($_GET['room_desc']);
if(mb_strlen($updata["room_desc"],'utf-8') > 180 ) return self::outerr(errcode::ErrParamter,"群介绍过长");
}
if(empty($updata)) {
return self::outerr(errcode::ErrParamter);
}
$ret = Model('room')->editRoom(['room_id'=>$room_id],$updata);
if($ret) {
room\factory_client::instance()->change($room_id);
return self::outsuccess(null);
} else {
return self::outerr(errcode::ErrDB);
}
}
/**
* 设置群内昵称 room_id member_nick
*/
public function change_membernickOp()
{
$room_id = intval($_GET['room_id']);
if($room_id <= 0) {
return self::outerr(errcode::ErrParamter);
}
$member_nick = trim($_GET['member_nick']);
$len = mb_strlen($member_nick,'utf-8');
if( $len <= 0 || $len > 40 ) {
return self::outerr(errcode::ErrParamter,"群备注名称不得为空或过长");
}
$user = intval($_GET['user']);
$self = session_helper::memberid();
$mod_room = Model('room');
if($user <= 0)
{
$ret = $mod_room->editRoomParts(['room_id' => $room_id,'member_id' => $self],['member_nick' => $member_nick]);
}
else
{
$item = $mod_room->getRoom($room_id);
if(empty($item)) {
return self::outerr(errcode::ErrParamter);
}
$info = new room\room_info($item);
if($info->owner() != $self) {
return self::outerr(errcode::ErrTalk,"只有管理员可以修改他人的备注");
}
$ret = $mod_room->editRoomParts(['room_id' => $room_id,'member_id' => $user],['member_nick' => $member_nick]);
}
if($ret) {
room\factory_client::instance()->change($room_id);
return self::outsuccess(null);
} else {
return self::outerr(errcode::ErrDB);
}
}
/**
* 设置群头像 room_id file_path
*/
public function change_room_avatarOp()
{
$room_id = intval($_POST['room_id']);
$upload_dir = 'room/avatars/';
$uploader = new room\uploader();
$res = $uploader->upfile($upload_dir,$info);
if($res == false) {
return self::outerr(errcode::ErrUploadFileFailed);
}
$file_name = $info['msg'];
$file_path = '/data/upload/'.$upload_dir . $file_name.'?tm='.time();
$ret = Model("room")->editRoom(['room_id' => $room_id],['avatar' => $file_path]);
if ($ret) {
room\factory_client::instance()->change($room_id);
return self::outsuccess(['avatar' => $file_path]);
} else {
return self::outerr(errcode::ErrDB);
}
}
/**
* 设置群头像2 room_id file_path
*/
public function change_room_avatar2Op()
{
$room_id = intval($_POST['room_id']);
$file_path = trim($_POST['file_path']);
if(empty($room_id) || empty($file_path)){
return self::outerr(errcode::ErrUploadFileFailed);
}
$ret = Model("room")->editRoom(['room_id' => $room_id],['avatar' => $file_path]);
if ($ret) {
room\factory_client::instance()->change($room_id);
return self::outsuccess(['avatar' => $file_path]);
} else {
return self::outerr(errcode::ErrDB);
}
}
/**
* 转让管理员
* 将 room_id 转让给 to_user
*/
public function change_room_ownerOp()
{
$room_id = intval($_GET['room_id']);
$to_user = explode(',', trim($_GET['room_owner']));
$to_user = $to_user[0];
$from_user = session_helper::memberid();
$mod_room = Model("room");
$item = $mod_room->getRoomParts(["room_id"=>$room_id,"member_id"=>$from_user,"state"=>0]);
if(empty($item)) {
return self::outerr(errcode::ErrMemberNotExist,"不是群主不可移交管理员");
}
$item = $mod_room->getRoomParts(["room_id"=>$room_id,"member_id"=>$to_user,"state"=>0]);
if(empty($item)) {
return self::outerr(errcode::ErrMemberNotExist,"用户已不在群中");
}
$member = new member_info($to_user);
$info = $member->filter();
$name = $info['nickname'];
///
$trans = new trans_wapper(null,__METHOD__);
$exchange = $this->exchage_room_owner($room_id,$from_user,$to_user);
$editres = $mod_room->editRoom(['room_id' => $room_id],['room_owner' => $to_user,"owner_name"=>$name]);
if($exchange && $editres){
$trans->commit();
return self::outsuccess("移交成功");
}else{
$trans->rollback();
return self::outerr(errcode::ErrTalk,"移交失败");
}
}
private function exchage_room_owner($room_id,$from_user,$to_user)
{
$mod_room = Model("room");
$update1 = $mod_room->editRoomParts(['room_id' => $room_id,'member_id' => $from_user],['type' => 0]);
$update2 = $mod_room->editRoomParts(['room_id' => $room_id,'member_id' => $to_user] ,['type' => 1]);
return $update1 && $update2;
}
/**
* 设置群公告 room_id room_notice
*/
public function change_room_noticeOp()
{
$room_id = intval($_GET['room_id']);
if($room_id <= 0) {
return self::outerr(errcode::ErrParamter);
}
$room_notice = trim($_GET['room_notice']);
$len = mb_strlen($room_notice,'utf-8');
if( $len <= 0 || $len > 450 ) {
return self::outerr(errcode::ErrParamter,"公告过长或为空");
}
$mod_room = Model('room');
$item = $mod_room->getRoom($room_id);
if(empty($item)) {
return self::outerr(errcode::ErrParamter,"错误的群信息");
}
$user = session_helper::memberid();
$info = new room\room_info($item);
if($info->owner() != $user) {
return self::outerr(errcode::ErrTalk,"只有管理员可以修改群公告");
}
$ret = Model("room")->editRoom(['room_id' => $room_id],['notice' => $room_notice]);
if($ret)
{
$content = "群公告@all\r\n{$room_notice}";
room\factory_client::instance()->notice_room($room_id,$user,proto_type::msg_stype_text,$content);
return self::outsuccess(null);
} else {
return self::outerr(errcode::ErrDB);
}
}
/**
* 设置群密码 room_id passwd use_pass(开启或关闭)
*/
public function change_passwdOp(){
$room_id = intval($_GET['room_id']);
$use_pass = intval($_GET['use_pass']);
if($room_id <= 0) {
return self::outerr(errcode::ErrParamter);
}
if($use_pass)
{
$passwd = strtolower(trim($_GET['passwd']));
$len = strlen($passwd);
if($len <> 4) {
return self::outerr(errcode::ErrParamter,"密码设置错误");
}
}else{
$passwd = "";
}
$mod_room = Model('room');
$item = $mod_room->getRoom($room_id);
if(empty($item)) {
return self::outerr(errcode::ErrParamter,"错误的群信息");
}
$user = session_helper::memberid();
$info = new room\room_info($item);
if($info->owner() != $user) {
return self::outerr(errcode::ErrTalk,"只有管理员可以修改群密码");
}
$ret = Model("room")->editRoom(['room_id' => $room_id],['passwd' => $passwd]);
if($ret) {
return self::outsuccess(null);
} else {
return self::outerr(errcode::ErrDB);
}
}
/**
* 清空聊天记录 room_id
*/
public function hide_msgOp()
{
$room_id = intval($_GET['room_id']);
$user = session_helper::memberid();
if($room_id < 0) {
return self::outerr(errcode::ErrParamter);
}
$mod_room = Model('room');
$hide_msg = 0;
$cond = ["room_id"=>$room_id, "member_id"=>$user, "state" => 0];
$item = $mod_room->getRoomParts($cond,"hide_msg",1);
if(!empty($item)) {
$hide_msg = $item[0]['hide_msg'];
}
$cur_msg = 0;
$item = $mod_room->getRoomsgList(["msg_type"=>0,"room_id"=>$room_id],1,'msg_id');
if(!empty($item)) {
$cur_msg = $item[0]['msg_id'];
}
if($cur_msg <= $hide_msg) {
return self::outerr(errcode::ErrTalk,"无历史记录可清除");
}
$update = $mod_room->editRoomParts($cond,["hide_msg"=>$cur_msg]);
if($update) {
return self::outsuccess(null,"清除成功");
} else {
return self::outerr(errcode::ErrTalk,"清除失败");
}
}
///////////////////群运动///////////////////////////////////////////////////////////////////////////////////
/**
* 群运动主页
*/
public function steps_homeOp(){
return self::outsuccess(null,'talk/room_steps');
}
public function room_stepsOp()
{
try
{
$room_id = intval($_GET['room_id']);
$mod_room = Model('room');
$userid = session_helper::memberid();
$room = $mod_room->getRoomParts(["room_id"=>$room_id,"member_id"=>$userid,"state"=>0],'room_id,member_id,steps',1);
if(empty($room)) return self::outerr(errcode::ErrParamter,"错误的群信息");
$user_steps = $this->user_steps($room[0]);
$steps = [];
$hasmore = false;
$per_page = 20;
$items = $mod_room->getRoomParts(["room_id"=>$room_id,"state"=>0],'member_id,steps,bonus',$per_page,"steps desc,FIELD(`member_id`,{$userid}) desc");
if(!empty($items))
{
foreach ($items as $k => $sport)
{
$info = new member_info($sport['member_id']);
$member = $info->filter();
$steps[$k]['member_id'] = $sport['member_id'];
$steps[$k]['steps'] = $sport['steps'];
$steps[$k]['avatar'] = $member['avatar'];
$steps[$k]['is_man'] = $member['is_man'];
$steps[$k]['nickname'] = util::ellipsis($member['nickname']);
$steps[$k]['bonus'] = $sport['bonus'];
}
if(count($steps) >= $per_page) $hasmore = true;
}
return self::outsuccess(["user"=>$user_steps,"steps"=>$steps,"mobile_page"=>["hasmore"=>$hasmore,"curpage"=>$this->cur_page]]);
} catch (Exception $ex) {
return self::outerr(errcode::ErrParamter);
}
}
private function user_steps($room_parti)
{
$info = new member_info($room_parti['member_id']);
$member = $info->filter();
$user_steps["member_id"] = $member['member_id'];
$user_steps['avatar'] = $member['avatar'];
$user_steps['is_man'] = $member['is_man'];
$user_steps['nickname'] = $member['nickname'];
$user_steps["steps"] = $room_parti['steps'];
$ranks = Model('room')->getRoomParts(["room_id"=>$room_parti['room_id'],"state"=>0,"steps"=>['gt',$room_parti['steps']]],'member_id',false,'steps desc');
$user_steps["ranking"] = count($ranks)+1;
return $user_steps;
}
/**
* 福利社个人运动详情页
*/
public function steps_detailOp()
{
$mid = session_helper::memberid();
$info = new member_info($mid);
$member = $info->filter();
$today = strtotime(date('Y-m-d',time()));
$first = $today - 86400 * 6;
$mod_room = Model('room');
$items = $mod_room->roomSteps(["member_id"=>$mid,"date_stamp"=>[['gt',$first-1],['lt',$today+1]]],'*',7);
$steps_info = [];
if(!empty($items)){
foreach ($items as $item){
$steps_info[$item['date_stamp']] = $item;
}
}
$charts = $this->steps_charts($first,$steps_info);
$room_steps = [];
$rooms = $mod_room->getRoomParts(["member_id"=>$mid,"state"=>0],'room_id',false);
if(!empty($rooms))
{
foreach ($rooms as $room) {
$params = $mod_room->getRoom($room['room_id']);
$rinfo = new room\room_info($params);
if($rinfo->type() !== proto_type::room_chat) continue;
$room['avatar'] = $rinfo->avatar();
$name = $rinfo->name();
$room['name'] = util::ellipsis($name);
$room['steps'] = $mod_room->totalRoomSteps($room['room_id']);
$room_steps[] = $room;
}
}
return self::outsuccess([
"background"=>RESOURCE_SITE_URL. "/mobile/talk/images/cover.png",
"avatar"=>$member['avatar'],
"nickname"=>$member['nickname'],
"charts"=>$charts,
"room_steps"=>$room_steps,
"donate_rate"=>self::donate_rate],
'talk/steps_detail');
}
private function steps_charts($first_date,$steps_info)
{
$charts = [];
for ($i=0; $i<7; $i++ )
{
$key = $first_date + 86400 * $i;
if($i==0){
$month = date('n月',$key);
$charts["month"] = $month;
}
if($i==6){
$month = date('n月',$key);
$charts["month"] = $charts["month"] == $month ? $month : $charts["month"].'-'.$month;
}
$charts["date"][] = date('d',$key);
if(isset($steps_info[$key])){
$charts["steps"][] = intval($steps_info[$key]['steps']);
}else{
$charts["steps"][] = 0;
}
}
return $charts;
}
/**
* 捐赠步数
*/
public function donate_stepsOp()
{
$room_id = intval($_GET['room_id']);
$steps = intval($_GET['steps']);
if($room_id <= 0 || $steps <= 0 ) {
return self::outerr(errcode::ErrParamter,"错误的参数");
}
$user = session_helper::memberid();
$today = strtotime(date('Y-m-d',time()));
$mod_room = Model('room');
$room = $mod_room->getRoomParts(['room_id' => $room_id,"member_id" => $user,"state" => 0],'*',1);
if(empty($room)) {
return self::outerr(errcode::ErrParamter,"您不在此群中");
}
$item = $mod_room->findSteps(['room_id' => $room_id,"member_id" => $user,'date_stamp' => $today]);
if(!empty($item)) {
$mod_room->editSteps(['steps_id' => $item['steps_id']],['steps' => ['exp',"steps + {$steps}"]]);
} else {
$mod_room->addSteps($room_id,$user,$steps,$today);
}
$amount = bcdiv($steps,self::donate_rate,2);
$mod_room->editRoomParts(['room_id' => $room_id,"member_id" => $user,"state" => 0],["steps" => ['exp',"steps + {$steps}"],"bonus" => ['exp',"bonus + {$amount}"]]);
$mod_room->editRoom(['room_id'=>$room_id],['steps_count' => ['exp',"steps_count + {$steps}"], 'shared_bonus' => ['exp',"shared_bonus + {$amount}"]]);
$content = ['user' => session_helper::memberid(),'steps' => $steps,'amount' => $amount];
room\factory_client::instance()->notice_room($room_id,0,proto_type::msg_stype_donate,$content);
return self::outsuccess(['amount'=>$amount]);
}
///////////////群认证////////////////////////////////////////////////////////////////////////////////////////
public function room_certificateOp()
{
$type = intval($_GET['ctype']);
$room_id = intval($_GET['talk_id']);
$cert = Model('room')->findCert(['room_id'=>$room_id,"ctype"=>$type]);
if(empty($cert)) $cert = [];
if($type == 1){
return self::outsuccess(['room_id'=>$room_id,"cert"=>$cert],'talk/school_certs');
}elseif($type == 2){
return self::outsuccess(['room_id'=>$room_id,"cert"=>$cert],'talk/enterprise_certs');
}else{
return;
}
}
public function commit_certsOp()
{
$cmobile = intval($_POST['cmobile']);
$code = trim($_POST['code']);
$validator = new Validator();
$validator->setValidate(Validator::verify_mobile($cmobile));
$validator->setValidate(Validator::verify_smscode($code));
$err = $validator->validate();
if ($err != '') {
return self::outerr(errcode::ErrInputParam, $err);
}
$ret = sms_helper::check_code(Sms::register_code,$code,$cmobile);
if(is_array($ret)) {
return self::outerr($ret['code'], $ret['msg']);
}
$ctype = intval($_POST['ctype']);
$room_id = intval($_POST['room_id']);
$short_name = trim($_POST['short_name']);
$full_name = trim($_POST['full_name']);
$cmail = trim($_POST['cmail']);
if(!preg_match('/^([.a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\\.[a-zA-Z0-9_-])+/',$cmail)) {
return self::outerr(errcode::ErrInputParam, "请输入正确的邮箱地址");
}
$cname = trim($_POST['cname']);
$cinfo = trim($_POST['cinfo']);
$cimage = $this->upload_cimage();
if($cimage === false){
return self::outerr(errcode::ErrUploadFileFailed);
}
$mod_room = Model('room');
$item = $mod_room->findCert(["room_id"=>$room_id]);
if(empty($item))
{
$insertId = $mod_room->addCert($ctype,$room_id,$short_name,$full_name,$cname,$cmobile,$cmail,$cinfo,$cimage);
if($insertId){
return self::outsuccess(null);
}else{
return self::outerr(errcode::ErrDB,"提交失败");
}
}
if($item['cstatus'] == 0){
return self::outerr(errcode::ErrTalk,"您已提交一份认证申请,请耐心等待审核,勿重复提交");
}
$updata['ctype'] = $ctype;
$updata['room_id'] = $room_id;
$updata["short_name"] = $short_name;
$updata["full_name"] = $full_name;
$updata["cname"] = $cname;
$updata["cmobile"] = $cmobile;
$updata["cmail"] = $cmail;
$updata["cinfo"] = $cinfo;
$updata["cimage"] = $cimage;
$updata['cstatus'] = 0;
$updata["add_time"] = time();
$update = $mod_room->editCerts(['cert_id'=>$item['cert_id']],$updata);
if($update){
return self::outsuccess(null);
}else{
return self::outerr(errcode::ErrDB,"提交失败");
}
}
private function upload_cimage()
{
$upload_dir = 'room/certs/';
$uploader = new room\uploader();
$res = $uploader->upfile($upload_dir,$info);
if($res) {
return '/data/upload/'.$upload_dir . $info['msg'].'?tm='.time();
} else {
return false;
}
}
//////////////群共享基金////////////////////////////////////////////////////////////////////////////////////////
/**
* 共享基金详情
* param $room_id int 房间id
*/
public function share_bonusOp()
{
$room_id = intval($_GET['room_id']);
if($room_id <= 0) {
return self::outerr(errcode::ErrParamter);
}
$mod_room = Model('room');
$room = $mod_room->getRoom($room_id);
if(empty($room)) {
return self::outerr(errcode::ErrParamter,"群信息有误");
}
$parts = new room\room_parts($room_id);
$uids = $parts->allparts();
if(!in_array(session_helper::memberid(),$uids)) {
return self::outerr(errcode::ErrParamter,"不可以偷看别人的共享资金哦");
}
$list = [];
$items = $mod_room->getRoomsgList(["room_id"=>$room_id,"type"=>['in',[proto_type::msg_type_donate,proto_type::msg_type_spend]]]);
if(!empty($items))
{
$uids = [];
foreach ($items as $idx => $item) {
$orgmsg = json_decode($item['orgmsg'],true);
$items[$idx]['amount'] = $orgmsg['amount'];
$items[$idx]['member_id'] = $orgmsg['user'];
$uids[] = $orgmsg['user'];
}
$uids = array_unique($uids);
$info = [];
$members = member_info::get_members($uids);
foreach ($members as $member){
$info[$member['member_id']]['avatar'] = $member['avatar'];
$info[$member['member_id']]['name'] = $member['nickname'];
}
foreach ($items as $val)
{
$uid = $val['member_id'];
$val['avatar'] = $info[$uid]['avatar'];
$val['name'] = $info[$uid]['name'];
$val['msg'] = $val['type'] == proto_type::msg_type_donate ? "+ ¥".$val['amount']."" : "- ¥".$val['amount']."";
$val['state'] = $val['type'] == proto_type::msg_type_donate ? 1:0;
$val['operate'] = $val['type'] == proto_type::msg_type_donate ? "贡献":"消费";
$list[] = $val;
}
}
return self::outsuccess(["room"=>$room,"list" => $list],'talk/share_bonus');
}
//////////////添加好友 申请入群 系统消息/////////////////////////////////////////////////////////////////////////////////////////
/**
* 信息输入板 wap编辑申请和公告使用
* param $type int 1:群申请 2:好友申请 3:查看/编辑群公告
* @场景type=1 relay_id(二维码扫码 立即入群)
* @场景type=2 talk_id(申请加好友的member_id)
* @场景type=3 talke_id(room_id)
*/
public function message_boardOp()
{
$type = intval($_GET['type']);
$talk_id = intval($_GET['talk_id']);
$relay_id = intval($_GET['relay_id']);
$isManager = intval($_GET['isManager']);
if(empty($type)) {
return self::outerr(errcode::ErrParamter,"打开页面失败");
}
$ajax_param["type"] = $type;
switch ($type){
case 1:
$ajax_param['title'] = "申请入群";
$ajax_param["talk_id"] = $talk_id;
$ajax_param["relay_id"] = $relay_id;
break;
case 2:
$ajax_param['title'] = "好友申请";
$ajax_param["talk_id"] = $talk_id;
break;
case 3:
$ajax_param['title'] = "群公告";
$ajax_param["talk_id"] = $talk_id;
$room = Model('room')->getRoom($talk_id);
$ajax_param['notice'] = isset($room['notice']) ? $room['notice'] : "";
$ajax_param['isManager'] = $isManager;
break;
default:
$ajax_param = [];
}
return self::outsuccess(["ajax_param"=>$ajax_param],'talk/message_board');
}
/**
* 新申请消息列表
*/
public function new_applysOp(){
return self::outsuccess(null,'talk/new_applys');
}
public function ajax_get_applysOp()
{
$mod_room = Model('room');
$member = session_helper::memberid();
$items = $mod_room->getRoomsgList(['member_id'=>$member,"type" => proto_type::msg_type_apply],$this->page_size());
if(!empty($items))
{
foreach ($items as $k => $apply)
{
$orgmsg = json_decode($apply['orgmsg'],true);
$type = $orgmsg['type'];
$items[$k]['type'] = $orgmsg['type'];
$items[$k]['room_id'] = $orgmsg['room_id'];
$items[$k]['userid'] = $orgmsg['from']['userid'];
$items[$k]['nickname'] = $orgmsg['from']['nickname'];
$items[$k]['avatar'] = $orgmsg['from']['avatar'];
$note = empty($orgmsg['note']) ? "" : $orgmsg['note'];
$items[$k]['content'] = util::ellipsis($note);
$items[$k]['state'] = $this->transform_state($orgmsg['state']);
$items[$k]['schema'] = "";
if(($type == 'apply_friend' || $type == 'apply_room') && $items[$k]['state']<=0) {
$items[$k]['schema'] = schema_helper::friend_apply($apply['msg_id']);
}
}
$hasmore = count($items) < $this->page_size() ? false : true;
}
else {
$items = [];
$hasmore = false;
}
return self::outsuccess(["applys"=>$items,"mobile_page" => ["hasmore" => $hasmore,"curpage" => $this->page_no()]]);
}
/**
* 好友申请
*/
public function add_friendsOp()
{
$user = intval($_GET['user']);
$msg = trim($_GET['msg']);
if($user <= 0 ){
return self::outerr(errcode::ErrRelation,"发送失败");
}
$relateion = new relation\mem_relation(session_helper::memberid());
$isfriend = $relateion->is_friends($user);
if($isfriend == false) {
$relateion->subscribe($user);
room\pusher::instance()->apply_friend(session_helper::memberid(),$user,$msg);
}
return self::outsuccess(null);
}
/**
* 入群申请
* param $room_id int 房间id
* param $relay_id int 二维码来源 member_id
* param $passwd int 四位入群密码
* param $apply int 1:发送入群申请非直接入群
* param $msg str 入群介绍
*/
public function send_applyOp()
{
$room_id = intval($_GET['room_id']);
$relay_id = intval($_GET['relay_id']);
if($room_id <= 0) {
return self::outerr(errcode::ErrParamter,"请求失败");
}
$member = session_helper::memberid();
$mod_room = Model('room');
$room = $mod_room->getRoom($room_id);
if(empty($room)) {
return self::outerr(errcode::ErrParamter,"房间不存在");
}
$isFromQr = false;
if($relay_id > 0) {
$parts = new room\room_parts($room_id);
$uids = $parts->allparts();
$isFromQr = in_array($relay_id,$uids) ? true : false;
}
$passwd = $room['passwd'];
$owner = $room['room_owner'];
$inviter = $isFromQr ? $relay_id : $owner;
if(empty($passwd) || $isFromQr) {
//立即入群
$ret = room\factory_client::instance()->invite($room_id,$inviter,[$member]);
if($ret === false) {
return self::outerr(errcode::ErrRoom,"进群失败");
}
else
{
$members = member_info::get_members($ret['newusers']);
$result['invitees'] = $members;
return self::outsuccess($result);
}
}
elseif(intval($_GET['apply'] == 1))
{
//发送入群申请
$msg = trim($_GET['msg']);
if(mb_strlen($msg,'utf-8') >= 100){
return self::outerr(errcode::ErrParamter,"入群申请过长,请缩短一些");
}
room\pusher::instance()->apply_room($member,$room_id,$msg);
return self::outsuccess(null,"申请成功");
}else {
if(strtolower(trim($_GET['passwd'])) !== strtolower($passwd)) {
return self::outerr(errcode::ErrParamter, "群密码有误");
}
$ret = room\factory_client::instance()->invite($room_id,$owner,[$member]);
if($ret === false) {
return self::outerr(errcode::ErrRoom, "进群失败");
}
$members = member_info::get_members($ret['newusers']);
$result['invitees'] = $members;
return self::outsuccess($result);
}
}
private function transform_state($state){
switch ($state){
case 'pending': return 0;break;
case 'accept': return 1;break;
case 'refuse': return 2;break;
default : return 0;
}
}
/**
* 系统消息
*/
public function sys_noticeOp()
{
return self::outsuccess(null,'talk/system_notice');
}
public function notice_listOp()
{
$mod_room = Model('room');
$memberid = session_helper::memberid();
$items = $mod_room->getRoomsgList(["member_id"=>$memberid,"type" => proto_type::msg_type_nofity],$this->page_size());
if(!empty($items))
{
foreach ($items as $k => $apply)
{
$orgmsg = json_decode($apply['orgmsg'],true);
$items[$k]['type'] = $orgmsg['type'];
$items[$k]['userid'] = $orgmsg['from']['userid'];
$items[$k]['nickname'] = $orgmsg['from']['nickname'];
$items[$k]['avatar'] = $orgmsg['from']['avatar'];
$items[$k]['content'] = $orgmsg["note"];
$items[$k]['schema'] = isset($orgmsg['schema'])? $orgmsg['schema'] : "";
}
$hasmore = count($items) < $this->page_size() ? false : true;
}
else {
$items = [];
$hasmore = false;
}
return self::outsuccess(["notice"=>$items,"mobile_page" => ["hasmore" => $hasmore,"curpage" => $this->page_no()]]);
}
////////////////群商品////////////////////////////////////////////////////////////////////////////////////////////
public function room_goodsOp()
{
$room_id = intval($_GET['talk_id']);
if( $room_id <= 0 ) {
return self::outerr(errcode::ErrParamter,"参数有误");
}
$mod_room = Model('room');
$items = $mod_room->getRoomsgList(["room_id"=>$room_id,"type"=>proto_type::msg_type_goods],20);
$gids = [];
foreach ($items as $item) {
$goods_id = intval($item['orgmsg']);
if($goods_id > 0) $gids[] = $goods_id;
}
$goods = [];
if(!empty($gids)) {
$gids = array_unique($gids);
$helper = new goods_helper($this->price_calcer());
$order = "field(goods_id,".implode(',',$gids).") asc";
$goods = $helper->get_infos($gids,0,$order);
}
return self::outsuccess( ["goods" => $goods] ,"/talk/room_goods");
}
///////////////认证群列表
public function official_roomsOp()
{
return self::outsuccess(null,'talk/official_rooms');
}
public function ajax_certs_roomsOp()
{
$mod_room = Model('room');
$items = $mod_room->getRooms(["type"=>proto_type::room_chat,"room_level"=>['gt',0]],'*','shared_bonus desc',$this->page_size(),$this->page_size());
$rooms = [];
$hasmore = false;
if(!empty($items))
{
foreach ($items as $item)
{
$info = new \room\room_info($item);
$rooms[] = $info->format();
}
$hasmore = count($items) < $this->page_size() ? false : true;
}
return self::outsuccess(["rooms"=>$rooms,"mobile_page" => ["hasmore" => $hasmore,"curpage" => $this->page_no()]]);
}
/////
public function del_fiendsOp()
{
}
}