[PHP] 純文本查看 復(fù)制代碼
<?php
/**
* [Discuz!] (C)2001-2099 Comsenz Inc.
* This is NOT a freeware, use is subject to license terms
*
* $Id: function_friend.php 26635 2011-12-19 01:59:13Z zhangguosheng $
*/
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
/**
* 獲取指定用戶的友人列表
*
* @param int $uid 用戶ID
* @param int $limit 返回結(jié)果的數(shù)量限制
* @param int $start 返回結(jié)果的起始位置(默認(rèn)為0)
* @return array 返回友人列表,鍵為友人的ID,值為友人信息
*/
function friend_list($uid, $limit, $start=0) {
$list = array();
$query = C::t('home_friend')->fetch_all_by_uid($uid, $start, $limit, true);
foreach($query as $value) {
$list[$value['fuid']] = $value;
}
return $list;
}
/**
* 獲取當(dāng)前用戶的友人分組列表
*
* @return array 返回友人分組列表
*/
function friend_group_list() {
global $_G;
$space = array('uid' => $_G['uid']);
space_merge($space, 'field_home');
$groups = array();
$spacegroup = empty($space['privacy']['groupname'])?array()
space['privacy']['groupname'];
for($i = 0; $i < $_G['setting']['friendgroupnum']; $i++) {
if($i == 0) {
$groups[0] = lang('friend', 'friend_group_default');
} else {
if(!empty($spacegroup[$i])) {
$groups[$i] = $spacegroup[$i];
} else {
if($i<8) {
$groups[$i] = lang('friend', 'friend_group_'.$i);
} else {
$groups[$i] = lang('friend', 'friend_group_more', array('num'=>$i));
}
}
}
}
return $groups;
}
/**
* 檢查指定用戶是否為當(dāng)前用戶的友人
*
* @param mixed $touids 可以是單個用戶ID或用戶ID數(shù)組
* @param int $isfull 是否獲取完整友人信息,默認(rèn)為0(只檢查友人關(guān)系是否存在)
* @return mixed 如果是數(shù)組形式的$touids,返回布爾值;如果是單個用戶ID,返回布爾值或友人信息數(shù)組
*/
function friend_check($touids, $isfull = 0) {
global $_G;
if(empty($_G['uid'])) return false;
if(is_array($touids)) {
$query = C::t('home_friend')->fetch_all_by_uid_fuid($_G['uid'], $touids);
foreach($query as $value) {
$touid = $value['fuid'];
$var = "home_friend_{$_G['uid']}_{$touid}";
$fvar = "home_friend_{$touid}_{$_G['uid']}";
$_G[$var] = $_G[$fvar] = true;
if($isfull) {
$fvarinfo = "home_friend_info_{$touid}_{$_G['uid']}";
$_G[$fvarinfo] = $value;
}
}
if(count($query) != count($touids)) {
return false;
} else {
return true;
}
} else {
$touid = $touids;
$var = "home_friend_{$_G['uid']}_{$touid}";
$fvar = "home_friend_{$touid}_{$_G['uid']}";
if(!isset($_G[$var])) {
$query = C::t('home_friend')->fetch_all_by_uid_fuid($_G['uid'], $touid);
$friend = isset($query[0]) ? $query[0] : '';
if($friend) {
$_G[$var] = $_G[$fvar] = true;
if($isfull) {
$fvarinfo = "home_friend_info_{$touid}_{$_G['uid']}";
$_G[$fvarinfo] = $friend;
}
} else {
$_G[$var] = $_G[$fvar] = false;
}
}
return $_G[$var];
}
}
/**
* 檢查指定用戶是否向當(dāng)前用戶發(fā)送了友人請求
*
* @param int $touid 目標(biāo)用戶ID
* @return bool 返回目標(biāo)用戶是否發(fā)送了友人請求
*/
function friend_request_check($touid) {
global $_G;
$var = "home_friend_request_{$touid}";
if(!isset($_G[$var])) {
$result = C::t('home_friend_request')->fetch_by_uid_fuid($_G['uid'], $touid);
$_G[$var] = $result?true:false;
}
return $_G[$var];
}
/**
* 添加友人關(guān)系
*
* @param int $touid 目標(biāo)用戶ID
* @param int $gid 友人分組ID,默認(rèn)為0
* @param string $note 添加友人的備注信息,默認(rèn)為空
* @return int 返回執(zhí)行結(jié)果,-2表示目標(biāo)用戶是當(dāng)前用戶,-1表示目標(biāo)用戶已發(fā)送添加請求,1表示添加成功
*/
function friend_add($touid, $gid=0, $note='') {
global $_G;
if($touid == $_G['uid']) return -2;
if(friend_check($touid)) return -2;
include_once libfile('function/stat');
$freind_request = C::t('home_friend_request')->fetch_by_uid_fuid($_G['uid'], $touid);
if($freind_request) {
// 處理已存在的友人請求,建立友人關(guān)系
$setarr = array(
'uid' => $_G['uid'],
'fuid' => $freind_request['fuid'],
'fusername' => addslashes($freind_request['fusername']),
'gid' => $gid,
'dateline' => $_G['timestamp']
);
C::t('home_friend')->insert($setarr);
friend_request_delete($touid);
friend_cache($_G['uid']);
$setarr = array(
'uid' => $touid,
'fuid' => $_G['uid'],
'fusername' => $_G['username'],
'gid' => $freind_request['gid'],
'dateline' => $_G['timestamp']
);
C::t('home_friend')->insert($setarr);
addfriendlog($_G['uid'], $touid);
friend_cache($touid);
updatestat('friend');
} else {
// 處理目標(biāo)用戶未發(fā)送請求的情況,插入新的友人請求
$to_freind_request = C::t('home_friend_request')->fetch_by_uid_fuid($touid, $_G['uid']);
if($to_freind_request) {
return -1;
}
$setarr = array(
'uid' => $touid,
'fuid' => $_G['uid'],
'fusername' => $_G['username'],
'gid' => $gid,
'note' => $note,
'dateline' => $_G['timestamp']
);
C::t('home_friend_request')->insert($setarr);
updatestat('addfriend');
}
return 1;
}
/**
* 添加好友
*
* @param int $touid 目標(biāo)用戶的ID
* @param string $tousername 目標(biāo)用戶的用戶名
* @param bool $checkrequest 是否檢查好友請求,默認(rèn)為true
* @return bool 返回false表示操作失敗,否則成功
*/
function friend_make($touid, $tousername, $checkrequest=true) {
global $_G;
// 檢查是否嘗試添加自己為好友
if($touid == $_G['uid']) return false;
// 如果需要檢查好友請求
if($checkrequest) {
// 刪除目標(biāo)用戶向當(dāng)前用戶發(fā)出的好友請求
$to_freind_request = C::t('home_friend_request')->fetch_by_uid_fuid($touid, $_G['uid']);
if($to_freind_request) {
C::t('home_friend_request')->delete_by_uid_fuid($touid, $_G['uid']);
}
// 刪除當(dāng)前用戶向目標(biāo)用戶發(fā)出的好友請求
$to_freind_request = C::t('home_friend_request')->fetch_by_uid_fuid($_G['uid'], $touid);
if($to_freind_request) {
C::t('home_friend_request')->delete_by_uid_fuid($_G['uid'], $touid);
}
}
// 插入兩條好友記錄,互為好友
$insertarray = array(
'uid' => $touid,
'fuid' => $_G['uid'],
'fusername' => $_G['username'],
'dateline' => $_G['timestamp'],
);
C::t('home_friend')->insert($insertarray, false, true);
$insertarray = array(
'uid' => $_G['uid'],
'fuid' => $touid,
'fusername' => $tousername,
'dateline' => $_G['timestamp'],
);
C::t('home_friend')->insert($insertarray, false, true);
// 添加好友操作日志
addfriendlog($_G['uid'], $touid);
// 更新統(tǒng)計信息
include_once libfile('function/stat');
updatestat('friend');
// 更新好友緩存
friend_cache($touid);
friend_cache($_G['uid']);
}
/**
* 添加好友日志
*
* @param int $uid 發(fā)起操作的用戶ID
* @param int $touid 被操作的用戶ID
* @param string $action 操作類型,默認(rèn)為'add'
* @return bool 返回true表示日志添加成功,false表示添加失敗
*/
function addfriendlog($uid, $touid, $action = 'add') {
global $_G;
// 檢查是否提供了有效的用戶ID
if($uid && $touid) {
$flog = array(
'uid' => $uid > $touid ? $uid : $touid,
'fuid' => $uid > $touid ? $touid : $uid,
'dateline' => $_G['timestamp'],
'action' => $action
);
DB::insert('home_friendlog', $flog, false, true);
return true;
}
return false;
}
/**
* 增加好友數(shù)量統(tǒng)計
*
* @param int $touid 目標(biāo)用戶的ID
*/
function friend_addnum($touid) {
global $_G;
// 檢查是否為當(dāng)前用戶ID,且不為自身
if($_G['uid'] && $_G['uid'] != $touid) {
C::t('home_friend')->update_num_by_uid_fuid(1, $_G['uid'], $touid);
}
}
/**
* 更新好友緩存
*
* @param int $touid 用戶ID
*/
function friend_cache($touid) {
global $_G;
// 合并用戶空間信息
$tospace = array('uid' => $touid);
space_merge($tospace, 'field_home');
// 獲取過濾組ID
$filtergids = empty($tospace['privacy']['filter_gid'])?array()
tospace['privacy']['filter_gid'];
$uids = array();
$count = 0;
$fcount = 0;
// 獲取所有好友信息
$query = C::t('home_friend')->fetch_all_by_uid($touid, 0, 0, true);
foreach($query as $value) {
// 排除自身
if($value['fuid'] == $touid) continue;
// 達(dá)到緩存好友數(shù)量上限
if($fcount > 200) {
$count = count($query);
break;
} elseif(empty($filtergids) || !in_array($value['gid'], $filtergids)) {
$uids[] = $value['fuid'];
$fcount++;
}
$count++;
}
// 更新用戶的好友列表緩存和好友數(shù)量
C::t('common_member_field_home')->update($touid, array('feedfriend'=>implode(',', $uids)));
C::t('common_member_count')->update($touid, array('friends'=>$count));
}
/**
* 刪除好友請求
* @param int $touid 目標(biāo)用戶的UID
* @return bool 刪除操作的結(jié)果,成功返回true,失敗返回false
*/
function friend_request_delete($touid) {
global $_G;
// 通過UID和目標(biāo)UID刪除好友請求
return C::t('home_friend_request')->delete_by_uid_fuid($_G['uid'], $touid);
}
/**
* 刪除好友
* @param int $touid 目標(biāo)用戶的UID
* @return bool 刪除操作的結(jié)果,成功返回true,失敗返回false
* 注:如果目標(biāo)用戶不是好友,則不執(zhí)行刪除操作并返回false。
*/
function friend_delete($touid) {
global $_G;
// 檢查是否為好友,如果不是則直接返回false
if(!friend_check($touid)) return false;
// 刪除好友關(guān)系
C::t('home_friend')->delete_by_uid_fuid_dual($_G['uid'], $touid);
// 如果刪除操作影響了行數(shù)(即刪除成功),則進行后續(xù)操作
if(DB::affected_rows()) {
// 添加刪除好友的日志
addfriendlog($_G['uid'], $touid, 'delete');
// 更新好友緩存
friend_cache($_G['uid']);
friend_cache($touid);
}
}
?>