Add move client
This commit is contained in:
parent
ccc686ae28
commit
513bc9b811
7 changed files with 63 additions and 8 deletions
12
README.md
12
README.md
|
@ -2,15 +2,13 @@
|
||||||
|
|
||||||
**ts3web** is a webinterface for any TeamSpeak 3 Server used with serverQuery login.
|
**ts3web** is a webinterface for any TeamSpeak 3 Server used with serverQuery login.
|
||||||
|
|
||||||
This webinterface aims to be as simple as possible. It does not provide complex features. Instead, it only supports features considered useful for a TeamSpeak 3 web interface. **The minimalistic approach is intentional!**
|
This webinterface aims to be as simple as possible. The minimalistic approach is intentional.
|
||||||
|
|
||||||
If you like to help (to translate or implement missing features), open an issue first. You should use existing code to implement new features. PRs will be merged after a code review.
|
If you like to help (to translate or implement features), open an issue first. If possible, you should use existing code to implement new features. PRs will be merged after a code review.
|
||||||
|
|
||||||
Things you **cannot** do:
|
Features which are currently not supported:
|
||||||
- Permissions Management (add, edit, delete for servergroups, channelgroups, clients)
|
- Permissions Management (except for viewing)
|
||||||
- File Management (except viewing)
|
- File Management (except for viewing)
|
||||||
- Temporary passwords
|
|
||||||
- Move online clients
|
|
||||||
|
|
||||||
## Install ##
|
## Install ##
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,7 @@ class ACL extends \Zend\Permissions\Acl\Acl
|
||||||
'/online/kick/{sid}/{clid}',
|
'/online/kick/{sid}/{clid}',
|
||||||
'/online/ban/{sid}/{clid}',
|
'/online/ban/{sid}/{clid}',
|
||||||
'/online/send/{sid}/{clid}',
|
'/online/send/{sid}/{clid}',
|
||||||
|
'/online/move/{sid}/{clid}',
|
||||||
|
|
||||||
'/clients/{sid}',
|
'/clients/{sid}',
|
||||||
'/clients/{sid}/{cldbid}',
|
'/clients/{sid}/{cldbid}',
|
||||||
|
|
|
@ -175,9 +175,13 @@ $app->post('/online/ban/{sid}/{clid}', OnlineBanAction::class);
|
||||||
$container[OnlineSendAction::class] = function ($container) {
|
$container[OnlineSendAction::class] = function ($container) {
|
||||||
return new OnlineSendAction($container);
|
return new OnlineSendAction($container);
|
||||||
};
|
};
|
||||||
|
|
||||||
$app->post('/online/send/{sid}/{clid}', OnlineSendAction::class);
|
$app->post('/online/send/{sid}/{clid}', OnlineSendAction::class);
|
||||||
|
|
||||||
|
$container[OnlineMoveAction::class] = function ($container) {
|
||||||
|
return new OnlineMoveAction($container);
|
||||||
|
};
|
||||||
|
$app->post('/online/move/{sid}/{clid}', OnlineMoveAction::class);
|
||||||
|
|
||||||
// group
|
// group
|
||||||
$container[GroupsAction::class] = function ($container) {
|
$container[GroupsAction::class] = function ($container) {
|
||||||
return new GroupsAction($container);
|
return new GroupsAction($container);
|
||||||
|
|
|
@ -213,6 +213,10 @@ bans.delete: "Delete"
|
||||||
complains.delete: "Delete"
|
complains.delete: "Delete"
|
||||||
|
|
||||||
# online
|
# online
|
||||||
|
online.move: "Move"
|
||||||
|
online.move.channel: "Channel"
|
||||||
|
online.move.channel_password: "Channel password"
|
||||||
|
online.moved.success: "Moved client %clid%."
|
||||||
online.kick: "Kick"
|
online.kick: "Kick"
|
||||||
online.kick.reason: "Reason"
|
online.kick.reason: "Reason"
|
||||||
online.poke: "Poke"
|
online.poke: "Poke"
|
||||||
|
|
|
@ -15,10 +15,19 @@ final class OnlineInfoAction extends AbstractAction
|
||||||
|
|
||||||
$dataResult = $this->ts->getInstance()->clientInfo($clid);
|
$dataResult = $this->ts->getInstance()->clientInfo($clid);
|
||||||
|
|
||||||
|
$channelsResult = $this->ts->getInstance()->channelList();
|
||||||
|
$channelsResult = $this->ts->getInstance()->getElement('data', $channelsResult);
|
||||||
|
$channels = [];
|
||||||
|
|
||||||
|
foreach ($channelsResult as $channel) {
|
||||||
|
$channels[$channel['channel_name']] = $channel['cid'];
|
||||||
|
}
|
||||||
|
|
||||||
// render GET
|
// render GET
|
||||||
$this->view->render($response, 'online_info.twig', [
|
$this->view->render($response, 'online_info.twig', [
|
||||||
'title' => $this->translator->trans('online_info.title') . ' ' . $clid,
|
'title' => $this->translator->trans('online_info.title') . ' ' . $clid,
|
||||||
'data' => $this->ts->getInstance()->getElement('data', $dataResult),
|
'data' => $this->ts->getInstance()->getElement('data', $dataResult),
|
||||||
|
'channels' => $channels,
|
||||||
'sid' => $sid,
|
'sid' => $sid,
|
||||||
'clid' => $clid,
|
'clid' => $clid,
|
||||||
]);
|
]);
|
||||||
|
|
29
src/Control/Actions/OnlineMoveAction.php
Normal file
29
src/Control/Actions/OnlineMoveAction.php
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Slim\Http\Request;
|
||||||
|
use Slim\Http\Response;
|
||||||
|
|
||||||
|
final class OnlineMoveAction extends AbstractAction
|
||||||
|
{
|
||||||
|
public function __invoke(Request $request, Response $response, $args)
|
||||||
|
{
|
||||||
|
$sid = $args['sid'];
|
||||||
|
$clid = $args['clid'];
|
||||||
|
|
||||||
|
$body = $request->getParsedBody();
|
||||||
|
|
||||||
|
$channel = $body['channel'];
|
||||||
|
$channelPassword = null;
|
||||||
|
if (array_key_exists('channel_password', $body)) $channelPassword = $body['channel_password'];
|
||||||
|
|
||||||
|
$this->ts->login($this->auth->getIdentity()['user'], $this->auth->getIdentity()['password']);
|
||||||
|
$selectResult = $this->ts->getInstance()->selectServer($sid, 'serverId');
|
||||||
|
|
||||||
|
if (empty($channelPassword)) $dataResult = $this->ts->getInstance()->clientMove($clid, $channel);
|
||||||
|
else $dataResult = $this->ts->getInstance()->clientMove($clid, $channel, $channelPassword);
|
||||||
|
|
||||||
|
|
||||||
|
$this->flash->addMessage('success', $this->translator->trans('online.moved.success', ['%clid%' => $clid]));
|
||||||
|
return $response->withRedirect('/online/' . $sid . '/' . $clid);
|
||||||
|
}
|
||||||
|
}
|
|
@ -34,6 +34,16 @@
|
||||||
{'type': 'number', 'key': 'time', 'label': 'online.ban.time'|trans}
|
{'type': 'number', 'key': 'time', 'label': 'online.ban.time'|trans}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
'header_label': 'online.move'|trans,
|
||||||
|
'label': '<i class="material-icons">check_circle</i>',
|
||||||
|
'uri': '/online/move/' ~ sid ~ '/' ~ clid,
|
||||||
|
'uri_method': 'post',
|
||||||
|
'fields': [
|
||||||
|
{'type': 'select', 'key': 'channel', 'options': channels,'label': 'online.move.channel'|trans},
|
||||||
|
{'type': 'text', 'key': 'channel_password', 'label': 'online.move.channel_password'|trans}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
'header_label': 'online.send'|trans,
|
'header_label': 'online.send'|trans,
|
||||||
'label': '<i class="material-icons">check_circle</i>',
|
'label': '<i class="material-icons">check_circle</i>',
|
||||||
|
|
Reference in a new issue