zentaopms/extension/xuan/im/ext/model/class/xuanxuan.class.php
2023-05-16 10:50:42 +08:00

273 lines
12 KiB
PHP
Executable File

<?php
class xuanxuanIm extends imModel
{
public function getExtensionList($userID)
{
$clientLang = $this->app->input['lang'];
$this->app->clientLang = $clientLang;
$this->app->loadLang('im');
$entries = array();
$baseURL = $this->getServer('zentao');
$this->loadModel('user');
$user = $this->dao->select('*')->from(TABLE_USER)->where('id')->eq($userID)->fetch();
$user->admin = strpos($this->app->company->admins, ",{$user->account},") !== false;
$user->rights = $this->user->authorize($user->account);
$user->groups = $this->user->getGroups($user->account);
$user->view = $this->user->grantUserView($user->account, $user->rights['acls']);
$this->session->set('user', $user);
$this->app->user = $this->session->user;
$products = $this->loadModel('product')->getPairs();
$executions = $this->loadModel('execution')->getPairs();
$products = empty($products) ? array() : array_keys($products);
$executions = empty($executions) ? array() : array_keys($executions);
$libIdList = array_keys($this->loadModel('doc')->getLibs('all'));
$productID = isset($products[0]) ? $products[0] : 0;
$executionID = isset($executions[0]) ? $executions[0] : 0;
$libID = isset($libIdList[0]) ? $libIdList[0] : 1;
$actions = new stdclass();
if(common::hasPriv('bug', 'create')) $actions->createBug = array('title' => $this->lang->im->createBug, 'url' => $baseURL . str_replace('/x.php', '/index.php', helper::createLink('bug', 'create', "product=$productID", 'xhtml')), 'height' => "600px", 'width' => "1200px");
if(common::hasPriv('story', 'create')) $actions->createStory = array('title' => $this->lang->im->createStory, 'url' => $baseURL . str_replace('/x.php', '/index.php', helper::createLink('story', 'create', "product=$productID", 'xhtml')), 'height' => "600px", 'width' => "1200px");
if(common::hasPriv('task', 'create')) $actions->createTask = array('title' => $this->lang->im->createTask, 'url' => $baseURL . str_replace('/x.php', '/index.php', helper::createLink('task', 'create', "execution=$executionID", 'xhtml')), 'height' => "600px", 'width' => "1200px");
if(common::hasPriv('doc', 'create')) $actions->createDoc = array('title' => $this->lang->im->createDoc, 'url' => $baseURL . str_replace('/x.php', '/index.php', helper::createLink('doc', 'create', "objectType=&objectID=0&libID=0", 'xhtml')), 'height' => "600px", 'width' => "1200px");
if(common::hasPriv('todo', 'create')) $actions->createTodo = array('title' => $this->lang->im->createTodo, 'url' => $baseURL . str_replace('/x.php', '/index.php', helper::createLink('todo', 'create', '', 'xhtml')), 'height' => "600px", 'width' => "1200px");
$urls = array();
foreach($this->config->im->cards as $moduleName => $methods)
{
foreach($methods as $methodName => $size)
{
if($this->config->requestType == 'GET')
{
$url = $this->config->webRoot . "index.php?m={$moduleName}&f={$methodName}";
}
else
{
$url = $this->config->webRoot . "{$moduleName}-{$methodName}-";
}
$urls[$url] = $size;
}
}
$data = new stdClass();
$data->entryID = 1;
$data->name = 'zentao-integrated';
$data->displayName = $this->lang->im->zentaoIntegrate;
$data->webViewUrl = trim($baseURL . $this->config->webRoot, '/');
$data->download = $baseURL . $this->config->webRoot . 'data/xuanxuan/zentao-integrated.zip';
$data->md5 = md5_file($this->app->getDataRoot() . 'xuanxuan/zentao-integrated.zip');
$data->data['actions'] = $actions;
$data->data['urls'] = $urls;
$data->data['entryUrl'] = trim($baseURL . $this->config->webRoot, '/');
$entries[] = $data;
unset($_SESSION['user']);
return $entries;
}
public function getServer($backend = 'xxb')
{
$server = commonModel::getSysURL();
if(!empty($this->config->xuanxuan->server))
{
$host = $this->server->http_host;
$position = strrpos($host, ':');
$port = $position === false ? '' : substr($host, $position + 1);
$server = $this->config->xuanxuan->server;
if($port and strpos($server, ":") === false)
{
$server = rtrim($server, '/');
$server = "{$server}:{$port}";
}
}
$server = rtrim($server, '/');
return $server;
}
public function uploadFile($fileName, $path, $size, $time, $userID, $users, $chat)
{
$user = $this->userGetByID($userID);
$extension = $this->loadModel('file')->getExtension($fileName);
$file = new stdclass();
$file->pathname = $path;
$file->title = rtrim($fileName, ".$extension");
$file->extension = $extension;
$file->size = $size;
$file->objectType = 'chat';
$file->objectID = $chat->id;
$file->addedBy = !empty($user->account) ? $user->account : '';
$file->addedDate = date(DT_DATETIME1, $time);
$this->dao->insert(TABLE_FILE)->data($file)->exec();
$fileID = $this->dao->lastInsertID();
$path .= md5($fileName . $fileID . $time);
$this->dao->update(TABLE_FILE)->set('pathname')->eq($path)->where('id')->eq($fileID)->exec();
return $fileID;
}
public function chatAddAction($chatId = '', $action = '', $actorId = '', $result = '', $comment = '')
{
return;
}
public function userAddAction($user, $actionType, $result, $comment = '', $common = false)
{
if(!zget($this->config->xuanxuan, 'logLevel', 1) && !$common) return;
$account = '';
$userID = 0;
if(is_int($user))
{
$account = $this->dao->select('account')->from(TABLE_USER)->where('id')->eq($user)->fetch('account');
$userID = $user;
}
if(is_string($user))
{
$userID = $this->dao->select('id')->from(TABLE_USER)->where('account')->eq($user)->fetch('id');
$account = $user;
}
$actor = !empty($account) ? $account : '';
$extra = json_encode(array('actorId' => $userID));
$this->loadModel('action')->create('user', $userID, $actionType, $comment, $extra, $actor);
}
public function messageGetNotifyList()
{
$onlineUsers = $this->loadModel('im')->userGetList('online');
if(empty($onlineUsers)) return array();
$onlineUsers = array_keys($onlineUsers);
$messageUserPairsData = $this->dao->select('message,user')->from(TABLE_IM_MESSAGESTATUS)
->where('status')->eq('waiting')
->andWhere('user')->in($onlineUsers)
->fetchAll();
if(empty($messageUserPairsData)) return array();
$messageUserPairs = array();
foreach($messageUserPairsData as $data)
{
if(isset($messageUserPairs[$data->message]))
{
$messageUserPairs[$data->message][] = $data->user;
continue;
}
$messageUserPairs[$data->message] = array($data->user);
}
$notifyMessages = $this->im->messageGetList('', array_keys($messageUserPairs), null, '', 'notify', false);
if(empty($notifyMessages)) return array();
$messageIDs = array();
foreach($notifyMessages as $message) $messageIDs[] = $message->id;
$messageUserPairs = array_intersect_key($messageUserPairs, array_flip($messageIDs));
$notifications = $this->im->messageFormatNotify($notifyMessages);
$data = array();
$messages = array();
foreach($notifications as $message)
{
foreach($messageUserPairs[$message->id] as $userID)
{
$messages[$userID][] = $message->id;
$data[$userID][] = $message;
}
}
foreach($messages as $userID => $message)
{
$this->dao->delete()->from(TABLE_IM_MESSAGESTATUS)
->where('message')->in($message)
->andWhere('user')->eq($userID)
->exec();
}
return $this->mergeNotifications($data);
}
/**
* Merge notifications with same actor, objectType, actionType. Notifications with contentType of 'text' won't be merged.
*
* @param array $notificationData
* @access public
* @return array
*/
public function mergeNotifications($notificationData)
{
/* Notification data: array($userID1 => array($notification1, $notification2), $userID2 => array($notification3)) */
foreach($notificationData as $userID => $userMessages)
{
$messageGroups = array();
foreach($userMessages as $message)
{
/* Group by $message->content->content->objectType, ...->parentType, ...->action, ...->actor */
$contentDataOuter = json_decode($message->content);
$contentData = json_decode($contentDataOuter->content);
if(isset($contentData->contentType) && $contentData->contentType == 'text')
{
$messageGroups[$contentData->contentType][] = $message;
continue;
}
if ($contentData->objectType == 'story' && $contentData->action == 'reviewed')
{
$extra = explode(',', $contentDataOuter->extra);
$actor = $extra[0];
$messageGroups["$contentData->objectType-$contentData->parentType-$contentData->action-$contentData->actor-$actor"][] = $message;
}
else
{
$messageGroups["$contentData->objectType-$contentData->parentType-$contentData->action-$contentData->actor"][] = $message;
}
}
foreach($messageGroups as $groupKey => $messages)
{
if(count($messages) < 2 || $groupKey == 'text') continue;
$notification = current($messages);
array_shift($messages);
$notificationContent = json_decode($notification->content);
$notificationInnerContent = json_decode($notificationContent->content);
/* Inner content: array($id => array($content1, $content2)) */
$objectGroups = array($notificationInnerContent->id => array($notificationInnerContent));
foreach($messages as $message)
{
$messageContent = json_decode($message->content);
$messageInnerContent = json_decode($messageContent->content);
$objectGroups[$messageInnerContent->id][] = $messageInnerContent;
}
foreach($objectGroups as $id => $objectGroup)
{
$object = current($objectGroup);
$object->count = count($objectGroup);
$object->url = $object->parentURL;
unset($object->title);
$objectGroups[$id] = $object;
}
$objectTotal = count($objectGroups);
$notificationContent->content = json_encode(array_values($objectGroups));
/* Hack alert: title count replacement currently assumes that default count is 1. */
$notification->title = substr_replace($notification->title, "$objectTotal", strrpos($notification->title, '1'), 1);
$notificationContent->title = $notification->title;
$notification->content = json_encode($notificationContent);
$messageGroups[$groupKey] = array($notification);
}
$mergedMessages = array();
$userMessageGroups = array_values($messageGroups);
foreach($userMessageGroups as $messageGroup) $mergedMessages = array_merge($mergedMessages, $messageGroup);
$notificationData[$userID] = $mergedMessages;
}
return $notificationData;
}
}