Merge pull request #8907 from nextcloud/feature/document-commands

Document occ commands
This commit is contained in:
Joas Schilling 2023-03-03 08:19:00 +01:00 коммит произвёл GitHub
Родитель bf82b65961 7f6dbab1a0
Коммит c726088277
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
12 изменённых файлов: 725 добавлений и 88 удалений

92
.github/workflows/occ-command-documentation.yml поставляемый Normal file
Просмотреть файл

@ -0,0 +1,92 @@
name: Documentation
on:
pull_request:
paths:
- '.github/workflows/**'
- 'appinfo/**'
- 'lib/**'
- 'templates/**'
- 'tests/**'
- 'vendor/**'
- 'vendor-bin/**'
- '.php-cs-fixer.dist.php'
- 'composer.json'
- 'composer.lock'
push:
branches:
- main
- master
- stable*
permissions:
contents: read
concurrency:
group: occ-commands-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
occ-commands:
runs-on: ubuntu-latest
strategy:
matrix:
php-versions: ['8.0', '8.1']
server-versions: ['master']
steps:
- name: Set app env
run: |
# Split and keep last
echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
- name: Checkout server
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3
with:
submodules: true
repository: nextcloud/server
ref: ${{ matrix.server-versions }}
- name: Checkout app
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3
with:
path: apps/${{ env.APP_NAME }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@1a18b2267f80291a81ca1d33e7c851fe09e7dfc4 # v2
with:
php-version: ${{ matrix.php-versions }}
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite
coverage: none
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Check composer file existence
id: check_composer
uses: andstor/file-existence-action@20b4d2e596410855db8f9ca21e96fbe18e12930b # v2
with:
files: apps/${{ env.APP_NAME }}/composer.json
- name: Set up dependencies
# Only run if phpunit config file exists
if: steps.check_composer.outputs.files_exists == 'true'
working-directory: apps/${{ env.APP_NAME }}
run: composer i
- name: Set up Nextcloud
env:
DB_PORT: 4444
run: |
mkdir data
./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password
./occ app:enable --force ${{ env.APP_NAME }}
./occ config:system:set debug --value true --type boolean
- name: Check if documentation is up to date
id: check_documentation
run: |
./occ talk:developer:update-docs
cd apps/${{ env.APP_NAME }}
bash -c "[[ ! \"`git status --porcelain `\" ]] || (cat docs/occ.md && echo 'Documentation outdated. Run the command talk:developer:update-docs locally, commit the occ.md file and push the changes.' && exit 1)"

Просмотреть файл

@ -85,6 +85,7 @@ And in the works for the [coming versions](https://github.com/nextcloud/spreed/m
<command>OCA\Talk\Command\Command\Delete</command>
<command>OCA\Talk\Command\Command\ListCommand</command>
<command>OCA\Talk\Command\Command\Update</command>
<command>OCA\Talk\Command\Developer\UpdateDocs</command>
<command>OCA\Talk\Command\Monitor\Calls</command>
<command>OCA\Talk\Command\Monitor\HasActiveCalls</command>
<command>OCA\Talk\Command\Monitor\Room</command>

Просмотреть файл

@ -1,3 +1,5 @@
# CoTURN configuration
### Background
The configuration of Nextcloud Talk mainly depends on your desired usage:

Просмотреть файл

@ -1,6 +1,4 @@
---
title: Capabilities
---
# Capabilities
## 3.0 (Initial Talk release)
* `audio` - audio is supported

Просмотреть файл

@ -1,6 +1,4 @@
---
title: Constants
---
# Constants
## Conversation

Просмотреть файл

@ -32,3 +32,4 @@
## Other
* [Chat commands](commands.md)
* [Occ commands](occ.md)

380
docs/occ.md Normal file
Просмотреть файл

@ -0,0 +1,380 @@
# Talk occ commands
## talk:command:add
Add a new command
### Usage
* `talk:command:add <cmd> <name> <script> <response> <enabled>`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `cmd` | The command as used in the chat "/help" => "help" | yes | no | `NULL` |
| `name` | Name of the user posting the response | yes | no | `NULL` |
| `script` | Script to execute (Must be using absolute paths only) | yes | no | `NULL` |
| `response` | Who should see the response: 0 - No one, 1 - User, 2 - All | yes | no | `NULL` |
| `enabled` | Who can use this command: 0 - Disabled, 1 - Moderators, 2 - Users, 3 - Guests | yes | no | `NULL` |
## talk:command:add-samples
Adds some sample commands: /wiki, …
### Usage
* `talk:command:add-samples`
## talk:command:delete
Remove an existing command
### Usage
* `talk:command:delete <command-id>`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `command-id` | | yes | no | `NULL` |
## talk:command:list
List all available commands
### Usage
* `talk:command:list [--output [OUTPUT]] [--] [<app>]`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `app` | Only list the commands of a specific app, "custom" to list all custom commands | no | no | `NULL` |
| Options | Accept value | Is value required | Is multiple | Default |
|---|---|---|---|---|
| `--output` | Output format (plain, json or json_pretty, default is plain) | yes | no | no | 'plain'` |
## talk:command:update
Add a new command
### Usage
* `talk:command:update <command-id> <cmd> <name> <script> <response> <enabled>`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `command-id` | | yes | no | `NULL` |
| `cmd` | The command as used in the chat "/help" => "help" | yes | no | `NULL` |
| `name` | Name of the user posting the response | yes | no | `NULL` |
| `script` | Script to execute (Must be using absolute paths only) | yes | no | `NULL` |
| `response` | Who should see the response: 0 - No one, 1 - User, 2 - All | yes | no | `NULL` |
| `enabled` | Who can use this command: 0 - Disabled, 1 - Moderators, 2 - Users, 3 - Guests | yes | no | `NULL` |
## talk:monitor:calls
Prints a list with conversations that have an active call as well as their participant count
### Usage
* `talk:monitor:calls [--output [OUTPUT]]`
| Options | Accept value | Is value required | Is multiple | Default |
|---|---|---|---|---|
| `--output` | Output format (plain, json or json_pretty, default is plain) | yes | no | no | 'plain'` |
## talk:active-calls
Allows you to check if calls are currently in process
### Usage
* `talk:active-calls [--output [OUTPUT]]`
| Options | Accept value | Is value required | Is multiple | Default |
|---|---|---|---|---|
| `--output` | Output format (plain, json or json_pretty, default is plain) | yes | no | no | 'plain'` |
## talk:monitor:room
Prints a list with conversations that have an active call as well as their participant count
### Usage
* `talk:monitor:room [--output [OUTPUT]] [--separator SEPARATOR] [--] <token>`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `token` | Token of the room to monitor | yes | no | `NULL` |
| Options | Accept value | Is value required | Is multiple | Default |
|---|---|---|---|---|
| `--output` | Output format (plain, json or json_pretty, default is plain) | yes | no | no | 'plain'` |
| `--separator` | Separator for the CSV list when output=csv is used | yes | yes | no | ','` |
## talk:room:add
Adds users to a room
### Usage
* `talk:room:add [--user USER] [--group GROUP] [--] <token>`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `token` | Token of the room to add users to | yes | no | `NULL` |
| Options | Accept value | Is value required | Is multiple | Default |
|---|---|---|---|---|
| `--user` | Invites the given users to the room | yes | yes | yes | array ()` |
| `--group` | Invites all members of the given groups to the room | yes | yes | yes | array ()` |
## talk:room:create
Create a new room
### Usage
* `talk:room:create [--description DESCRIPTION] [--user USER] [--group GROUP] [--public] [--readonly] [--listable LISTABLE] [--password PASSWORD] [--owner OWNER] [--moderator MODERATOR] [--message-expiration MESSAGE-EXPIRATION] [--] <name>`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `name` | The name of the room to create | yes | no | `NULL` |
| Options | Accept value | Is value required | Is multiple | Default |
|---|---|---|---|---|
| `--description` | The description of the room to create | yes | yes | no | NULL` |
| `--user` | Invites the given users to the room to create | yes | yes | yes | array ()` |
| `--group` | Invites all members of the given group to the room to create | yes | yes | yes | array ()` |
| `--public` | Creates the room as public room if set | no | no | no | false` |
| `--readonly` | Creates the room with read-only access only if set | no | no | no | false` |
| `--listable` | Creates the room with the given listable scope | yes | yes | no | NULL` |
| `--password` | Protects the room to create with the given password | yes | yes | no | NULL` |
| `--owner` | Sets the given user as owner of the room to create | yes | yes | no | NULL` |
| `--moderator` | Promotes the given users to moderators | yes | yes | yes | array ()` |
| `--message-expiration` | Seconds to expire a message after sent. If zero will disable the expire message duration. | yes | yes | no | NULL` |
## talk:room:delete
Deletes a room
### Usage
* `talk:room:delete <token>`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `token` | Token of the room to delete | yes | no | `NULL` |
## talk:room:demote
Demotes participants of a room to regular users
### Usage
* `talk:room:demote <token> <participant>...`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `token` | Token of the room in which users should be demoted | yes | no | `NULL` |
| `participant` | Demotes the given participants of the room to regular users | yes | yes | `array ()` |
## talk:room:promote
Promotes participants of a room to moderators
### Usage
* `talk:room:promote <token> <participant>...`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `token` | Token of the room in which users should be promoted | yes | no | `NULL` |
| `participant` | Promotes the given participants of the room to moderators | yes | yes | `array ()` |
## talk:room:remove
Remove users from a room
### Usage
* `talk:room:remove <token> <participant>...`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `token` | Token of the room to remove users from | yes | no | `NULL` |
| `participant` | Removes the given participants from the room | yes | yes | `array ()` |
## talk:room:update
Updates a room
### Usage
* `talk:room:update [--name NAME] [--description DESCRIPTION] [--public PUBLIC] [--readonly READONLY] [--listable LISTABLE] [--password PASSWORD] [--owner OWNER] [--message-expiration MESSAGE-EXPIRATION] [--] <token>`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `token` | The token of the room to update | yes | no | `NULL` |
| Options | Accept value | Is value required | Is multiple | Default |
|---|---|---|---|---|
| `--name` | Sets a new name for the room | yes | yes | no | NULL` |
| `--description` | Sets a new description for the room | yes | yes | no | NULL` |
| `--public` | Modifies the room to be a public room (value 1) or private room (value 0) | yes | yes | no | NULL` |
| `--readonly` | Modifies the room to be read-only (value 1) or read-write (value 0) | yes | yes | no | NULL` |
| `--listable` | Modifies the room's listable scope | yes | yes | no | NULL` |
| `--password` | Sets a new password for the room; pass an empty value to remove password protection | yes | yes | no | NULL` |
| `--owner` | Sets the given user as owner of the room; pass an empty value to remove the owner | yes | yes | no | NULL` |
| `--message-expiration` | Seconds to expire a message after sent. If zero will disable the expire message duration. | yes | yes | no | NULL` |
## talk:signaling:add
Add an external signaling server.
### Usage
* `talk:signaling:add [--verify] [--] <server> <secret>`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `server` | A server string, ex. wss://signaling.example.org | yes | no | `NULL` |
| `secret` | A shared secret string. | yes | no | `NULL` |
| Options | Accept value | Is value required | Is multiple | Default |
|---|---|---|---|---|
| `--verify` | Validate SSL certificate if set. | no | no | no | false` |
## talk:signaling:delete
Remove an existing signaling server.
### Usage
* `talk:signaling:delete <server>`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `server` | An external signaling server string, ex. wss://signaling.example.org | yes | no | `NULL` |
## talk:signaling:list
List external signaling servers.
### Usage
* `talk:signaling:list [--output [OUTPUT]]`
| Options | Accept value | Is value required | Is multiple | Default |
|---|---|---|---|---|
| `--output` | Output format (plain, json or json_pretty, default is plain) | yes | no | no | 'plain'` |
## talk:stun:add
Add a new STUN server.
### Usage
* `talk:stun:add <server>`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `server` | A domain name and port number separated by the colons, ex. stun.nextcloud.com:443 | yes | no | `NULL` |
## talk:stun:delete
Remove an existing STUN server.
### Usage
* `talk:stun:delete <server>`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `server` | A domain name and port number separated by the colons, ex. stun.nextcloud.com:443 | yes | no | `NULL` |
## talk:stun:list
List STUN servers.
### Usage
* `talk:stun:list [--output [OUTPUT]]`
| Options | Accept value | Is value required | Is multiple | Default |
|---|---|---|---|---|
| `--output` | Output format (plain, json or json_pretty, default is plain) | yes | no | no | 'plain'` |
## talk:turn:add
Add a TURN server.
### Usage
* `talk:turn:add [--secret SECRET] [--generate-secret] [--] <schemes> <server> <protocols>`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `schemes` | Schemes, can be turn or turns or turn,turns. | yes | no | `NULL` |
| `server` | A domain name, ex. turn.nextcloud.com | yes | no | `NULL` |
| `protocols` | Protocols, can be udp or tcp or udp,tcp. | yes | no | `NULL` |
| Options | Accept value | Is value required | Is multiple | Default |
|---|---|---|---|---|
| `--secret` | A shard secret string | yes | yes | no | NULL` |
| `--generate-secret` | Generate secret if set. | no | no | no | false` |
## talk:turn:delete
Remove an existing TURN server.
### Usage
* `talk:turn:delete <schemes> <server> <protocols>`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `schemes` | Schemes, can be turn or turns or turn,turns | yes | no | `NULL` |
| `server` | A domain name, ex. turn.nextcloud.com | yes | no | `NULL` |
| `protocols` | Protocols, can be udp or tcp or udp,tcp | yes | no | `NULL` |
## talk:turn:list
List TURN servers.
### Usage
* `talk:turn:list [--output [OUTPUT]]`
| Options | Accept value | Is value required | Is multiple | Default |
|---|---|---|---|---|
| `--output` | Output format (plain, json or json_pretty, default is plain) | yes | no | no | 'plain'` |
## talk:user:remove
Remove a user from all their rooms
### Usage
* `talk:user:remove [--user USER]`
| Options | Accept value | Is value required | Is multiple | Default |
|---|---|---|---|---|
| `--user` | Remove the given users from all rooms | yes | yes | yes | array ()` |
## talk:user:transfer-ownership
Adds the destination-user with the same participant type to all (not one-to-one) conversations of source-user
### Usage
* `talk:user:transfer-ownership [--include-non-moderator] [--remove-source-user] [--] <source-user> <destination-user>`
| Arguments | Description | Is required | Is array | Default |
|---|---|---|---|---|
| `source-user` | Owner of conversations which shall be moved | yes | no | `NULL` |
| `destination-user` | User who will be the new owner of the conversations | yes | no | `NULL` |
| Options | Accept value | Is value required | Is multiple | Default |
|---|---|---|---|---|
| `--include-non-moderator` | Also include conversations where the source-user is a normal user | no | no | no | false` |
| `--remove-source-user` | Remove the source-user from the conversations | no | no | no | false` |

Просмотреть файл

@ -37,22 +37,3 @@ In Apache, if _mod_mime_ and _.htaccess_ files are enabled, the default _.htacce
## TURN server
A TURN server running on **port 443** (or 80) is required in almost all scenarios, see [Configuring coTURN](TURN.md) for more details.
# Browsers
## Recommended
* Firefox: latest
* Chrome/Chromium: latest
## Supported
* Firefox / Firefox ESR: 52 or later
* Chrome / Chromium: 49 or later
* Edge: latest
* Safari: 13 or later
# Mobile apps
* Android: 6 or later
* iOS: 14 or later

20
docs/user-requirements.md Normal file
Просмотреть файл

@ -0,0 +1,20 @@
# User system requirements
## Browsers
### Recommended
* Firefox: latest
* Chrome/Chromium: latest
### Supported
* Firefox / Firefox ESR: 52 or later
* Chrome / Chromium: 49 or later
* Edge: latest
* Safari: 13 or later
## Mobile apps
* Android: 6 or later
* iOS: 14 or later

Просмотреть файл

@ -0,0 +1,161 @@
<?php
declare(strict_types=1);
/**
* @copyright Copyright (c) 2020 Joas Schilling <coding@schilljs.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Talk\Command\Developer;
use OC\Core\Command\Base;
use OCP\App\IAppManager;
use OCP\IConfig;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class UpdateDocs extends Base {
private IConfig $config;
private IAppManager $appManager;
public function __construct(IConfig $config) {
$this->config = $config;
parent::__construct();
}
public function isEnabled(): bool {
return $this->config->getSystemValue('debug', false) === true;
}
protected function configure(): void {
$this
->setName('talk:developer:update-docs')
->setDescription('Update documentation of commands')
;
}
protected function execute(InputInterface $input, OutputInterface $output): int {
$this->appManager = \OC::$server->get(IAppManager::class);
$info = $this->appManager->getAppInfo('spreed');
$documentation = "# Talk occ commands\n\n";
foreach ($info['commands'] as $namespace) {
if ($namespace === self::class) {
continue;
}
$command = $this->getCommand($namespace);
$documentation .= $this->getDocumentation($command) . "\n";
}
$handle = fopen(__DIR__ . '/../../../docs/occ.md', 'w');
fwrite($handle, $documentation);
fclose($handle);
return 0;
}
protected function getCommand(string $namespace): Command {
$command = \OC::$server->get($namespace);
// Clean full definition of command that have the default Symfony options
$command->setApplication($this->getApplication());
return $command;
}
protected function getDocumentation(Command $command): string {
$doc = '## ' . $command->getName() . "\n\n";
$doc .= $command->getDescription() . "\n\n";
$doc .=
'### Usage' . "\n\n" .
array_reduce(
array_merge(
[$command->getSynopsis()],
$command->getAliases(),
$command->getUsages()
),
function ($carry, $usage) {
return $carry.'* `'.$usage.'`'."\n";
}
);
$doc .= $this->describeInputDefinition($command);
return $doc;
}
protected function describeInputDefinition(Command $command): string {
$definition = $command->getDefinition();
$text = '';
if (\count($definition->getArguments()) > 0) {
$text .= "\n";
$text .= "| Arguments | Description | Is required | Is array | Default |\n";
$text .= '|---|---|---|---|---|';
foreach ($definition->getArguments() as $argument) {
$text .= "\n";
if (null !== $describeInputArgument = $this->describeInputArgument($argument)) {
$text .= $describeInputArgument;
}
}
$text .= "\n";
}
if (\count($definition->getOptions()) > 0) {
$text .= "\n";
$text .= "| Options | Accept value | Is value required | Is multiple | Default |\n";
$text .= '|---|---|---|---|---|';
foreach ($definition->getOptions() as $option) {
$text .= "\n";
if (null !== $describeInputOption = $this->describeInputOption($option)) {
$text .= $describeInputOption;
}
}
$text .= "\n";
}
return $text;
}
protected function describeInputArgument(InputArgument $argument): string {
$description = $argument->getDescription();
return
'| `'.($argument->getName() ?: '<none>')."` | " .
($description ? preg_replace('/\s*[\r\n]\s*/', " ", $description) : '') . ' | ' .
($argument->isRequired() ? 'yes' : 'no')." | " .
($argument->isArray() ? 'yes' : 'no')." | " .
'`' . str_replace("\n", '', var_export($argument->getDefault(), true)) . "` |";
}
protected function describeInputOption(InputOption $option): string {
$name = '--'.$option->getName();
if ($option->getShortcut()) {
$name .= '|-'.str_replace('|', '|-', $option->getShortcut()).'';
}
$description = $option->getDescription();
return
'| `'.$name.'` | ' .
($description ? preg_replace('/\s*[\r\n]\s*/', " ", $description) : '') . ' | '.
($option->acceptValue() ? 'yes' : 'no')." | " .
($option->isValueRequired() ? 'yes' : 'no')." | " .
($option->isArray() ? 'yes' : 'no')." | " .
str_replace("\n", '', var_export($option->getDefault(), true)).'` |';
}
}

Просмотреть файл

@ -17,10 +17,18 @@ markdown_extensions:
nav:
- 'Nextcloud Talk API': 'index.md'
- 'System requirements': 'system-requirements.md'
- 'Call experience': 'call-experience.md'
- Constants: 'constants.md'
- Capabilities: 'capabilities.md'
- 'User system requirements': 'user-requirements.md'
- 'Administration documentation':
- 'Server system requirements': 'system-requirements.md'
- 'Configuring coTURN': 'TURN.md'
- 'Occ commands': 'occ.md'
- 'Commands': 'commands.md'
- 'Matterbridge integration': 'matterbridge.md'
- 'Developer documentation':
- 'Constants': 'constants.md'
- 'Capabilities': 'capabilities.md'
- 'PHP events': 'events.md'
- 'API documentation':
- 'Conversations management': 'conversation.md'
- 'Participants management': 'participant.md'
@ -34,7 +42,3 @@ nav:
- 'Settings': 'settings.md'
- 'Integration by other apps': 'integration.md'
- 'Signaling API': 'internal-signaling.md'
- Commands: 'commands.md'
- 'PHP events': 'events.md'
- 'Configuring coTURN': 'TURN.md'
- 'Matterbridge integration': 'matterbridge.md'

Просмотреть файл

@ -1,198 +1,198 @@
<?xml version="1.0" encoding="UTF-8"?>
<files psalm-version="5.2.0@fb685a16df3050d4c18d8a4100fe83abe6458cba">
<files psalm-version="5.6.0@e784128902dfe01d489c4123d69918a9f3c1eac5">
<file src="lib/AppInfo/Application.php">
<UndefinedClass occurrences="2">
<UndefinedClass>
<code>BeforeTemplateRenderedEvent</code>
<code>BeforeTemplateRenderedEvent</code>
</UndefinedClass>
<UndefinedInterfaceMethod occurrences="1">
<UndefinedInterfaceMethod>
<code>getSettingsManager</code>
</UndefinedInterfaceMethod>
</file>
<file src="lib/BackgroundJob/CheckReferenceIdColumn.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>SchemaWrapper</code>
</UndefinedClass>
</file>
<file src="lib/Chat/ChatManager.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>NullCache</code>
</UndefinedClass>
</file>
<file src="lib/Chat/MessageParser.php">
<UndefinedVariable occurrences="1">
<UndefinedVariable>
<code>$guestNames</code>
</UndefinedVariable>
</file>
<file src="lib/Chat/Parser/SystemMessage.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>\OC_Util</code>
</UndefinedClass>
</file>
<file src="lib/Command/Command/Add.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Command/AddSamples.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Command/Delete.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Command/ListCommand.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Command/Update.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Developer/UpdateDocs.php">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Monitor/Calls.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Monitor/HasActiveCalls.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Monitor/Room.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Room/Add.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Room/Create.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Room/Delete.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Room/Demote.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Room/Promote.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Room/Remove.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Room/Update.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Signaling/Add.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Signaling/Delete.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Signaling/ListCommand.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Stun/Add.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Stun/Delete.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Stun/ListCommand.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Turn/Add.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Turn/Delete.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/Turn/ListCommand.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/User/Remove.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Command/User/TransferOwnership.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Base</code>
</UndefinedClass>
</file>
<file src="lib/Config.php">
<NullArgument occurrences="1">
<NullArgument>
<code>null</code>
</NullArgument>
</file>
<file src="lib/Controller/ChatController.php">
<InvalidArrayOffset occurrences="1">
<code>$commentIdToIndex[$parentId]</code>
</InvalidArrayOffset>
</file>
<file src="lib/Controller/SettingsController.php">
<InvalidArgument occurrences="1">
<InvalidArgument>
<code>SharedStorage::class</code>
</InvalidArgument>
</file>
<file src="lib/Controller/TempAvatarController.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Filesystem</code>
</UndefinedClass>
</file>
<file src="lib/Files/TemplateLoader.php">
<UndefinedClass occurrences="2">
<UndefinedClass>
<code>LoadSidebar</code>
<code>LoadSidebar</code>
</UndefinedClass>
</file>
<file src="lib/Files/Util.php">
<InvalidArgument occurrences="2">
<InvalidArgument>
<code>$fileId</code>
<code>SharedStorage::class</code>
</InvalidArgument>
</file>
<file src="lib/MatterbridgeManager.php">
<UndefinedClass occurrences="7">
<UndefinedClass>
<code>$this-&gt;tokenProvider</code>
<code>$this-&gt;tokenProvider</code>
<code>$this-&gt;tokenProvider</code>
@ -203,49 +203,48 @@
</UndefinedClass>
</file>
<file src="lib/Middleware/InjectionMiddleware.php">
<UndefinedInterfaceMethod occurrences="1">
<UndefinedInterfaceMethod>
<code>getAnnotationParameter</code>
</UndefinedInterfaceMethod>
</file>
<file src="lib/Migration/Version2001Date20170707115443.php">
<InvalidArrayAccess occurrences="1">
<InvalidArrayAccess>
<code>$return['num_rooms']</code>
</InvalidArrayAccess>
</file>
<file src="lib/Notification/Notifier.php">
<InvalidPropertyAssignmentValue occurrences="3">
<InvalidPropertyAssignmentValue>
<code>$this-&gt;participants</code>
<code>$this-&gt;rooms</code>
<code>$this-&gt;rooms</code>
</InvalidPropertyAssignmentValue>
</file>
<file src="lib/PublicShare/TemplateLoader.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>BeforeTemplateRenderedEvent</code>
</UndefinedClass>
</file>
<file src="lib/PublicShareAuth/TemplateLoader.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>BeforeTemplateRenderedEvent</code>
</UndefinedClass>
</file>
<file src="lib/Service/AvatarService.php">
<UndefinedClass occurrences="2">
<UndefinedClass>
<code>Filesystem</code>
<code>\OC_Image</code>
</UndefinedClass>
</file>
<file src="lib/Service/RecordingService.php">
<UndefinedClass occurrences="2">
<code>Filesystem</code>
<UndefinedClass>
<code>NoUserException</code>
</UndefinedClass>
</file>
<file src="lib/Share/Listener.php">
<InvalidArgument occurrences="1">
<InvalidArgument>
<code>[self::class, 'listenPreShare']</code>
</InvalidArgument>
<UndefinedClass occurrences="7">
<UndefinedClass>
<code>$event-&gt;getView()</code>
<code>$event-&gt;getView()</code>
<code>$event-&gt;getView()</code>
@ -256,12 +255,12 @@
</UndefinedClass>
</file>
<file src="lib/Share/RoomShareProvider.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>Cache</code>
</UndefinedClass>
</file>
<file src="lib/TInitialState.php">
<UndefinedClass occurrences="1">
<UndefinedClass>
<code>NoUserException</code>
</UndefinedClass>
</file>