Rename marketplace plugin to meetletacbfree (mdl_modules.name limit + CI table prefixes)

This commit is contained in:
2026-09-01 23:24:11 +03:30
parent 555cd725f7
commit d987994ded
77 changed files with 1497 additions and 1322 deletions
+20 -20
View File
@@ -17,14 +17,14 @@
/**
* Reset-to-default controls for access settings (role mapping + feature matrix).
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet <info@meetlet.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\admin;
namespace mod_meetletacbfree\admin;
use mod_meetletacbmarketplace\local\icons;
use mod_meetletacbfree\local\icons;
use moodle_url;
defined('MOODLE_INTERNAL') || die();
@@ -41,9 +41,9 @@ class access_reset_ui {
*/
public static function toolbar(string $section): string {
if ($section === 'rolemapping') {
$label = get_string('reset_rolemapping', 'meetletacbmarketplace');
$label = get_string('reset_rolemapping', 'meetletacbfree');
} else if ($section === 'featureaccess') {
$label = get_string('reset_featureaccess', 'meetletacbmarketplace');
$label = get_string('reset_featureaccess', 'meetletacbfree');
} else {
return '';
}
@@ -88,18 +88,18 @@ class access_reset_ui {
*/
public static function client_strings(): array {
return [
'modal_cancel' => get_string('accessreset_modal_cancel', 'meetletacbmarketplace'),
'modal_close' => get_string('accessreset_modal_close', 'meetletacbmarketplace'),
'modal_ok' => get_string('accessreset_modal_ok', 'meetletacbmarketplace'),
'confirm_reset' => get_string('accessreset_confirm_reset', 'meetletacbmarketplace'),
'confirm_rolemapping_title' => get_string('reset_rolemapping_confirm_title', 'meetletacbmarketplace'),
'confirm_rolemapping' => get_string('reset_rolemapping_confirm', 'meetletacbmarketplace'),
'confirm_featureaccess_title' => get_string('reset_featureaccess_confirm_title', 'meetletacbmarketplace'),
'confirm_featureaccess' => get_string('reset_featureaccess_confirm', 'meetletacbmarketplace'),
'success_rolemapping' => get_string('reset_success_rolemapping', 'meetletacbmarketplace'),
'success_featureaccess' => get_string('reset_success_featureaccess', 'meetletacbmarketplace'),
'error' => get_string('reset_error', 'meetletacbmarketplace'),
'busy' => get_string('accessreset_busy', 'meetletacbmarketplace'),
'modal_cancel' => get_string('accessreset_modal_cancel', 'meetletacbfree'),
'modal_close' => get_string('accessreset_modal_close', 'meetletacbfree'),
'modal_ok' => get_string('accessreset_modal_ok', 'meetletacbfree'),
'confirm_reset' => get_string('accessreset_confirm_reset', 'meetletacbfree'),
'confirm_rolemapping_title' => get_string('reset_rolemapping_confirm_title', 'meetletacbfree'),
'confirm_rolemapping' => get_string('reset_rolemapping_confirm', 'meetletacbfree'),
'confirm_featureaccess_title' => get_string('reset_featureaccess_confirm_title', 'meetletacbfree'),
'confirm_featureaccess' => get_string('reset_featureaccess_confirm', 'meetletacbfree'),
'success_rolemapping' => get_string('reset_success_rolemapping', 'meetletacbfree'),
'success_featureaccess' => get_string('reset_success_featureaccess', 'meetletacbfree'),
'error' => get_string('reset_error', 'meetletacbfree'),
'busy' => get_string('accessreset_busy', 'meetletacbfree'),
];
}
@@ -116,7 +116,7 @@ class access_reset_ui {
'type' => 'button',
'class' => 'meetlet-modal__close',
'data-meetlet-modal-dismiss' => '1',
'aria-label' => get_string('accessreset_modal_close', 'meetletacbmarketplace'),
'aria-label' => get_string('accessreset_modal_close', 'meetletacbfree'),
]),
'meetlet-modal__head'
) .
@@ -124,12 +124,12 @@ class access_reset_ui {
'id' => 'meetlet-access-reset-modal-body',
]) .
\html_writer::div(
\html_writer::tag('button', get_string('accessreset_modal_cancel', 'meetletacbmarketplace'), [
\html_writer::tag('button', get_string('accessreset_modal_cancel', 'meetletacbfree'), [
'type' => 'button',
'class' => 'btn btn-outline-secondary',
'data-meetlet-modal-dismiss' => '1',
]) .
\html_writer::tag('button', get_string('accessreset_confirm_reset', 'meetletacbmarketplace'), [
\html_writer::tag('button', get_string('accessreset_confirm_reset', 'meetletacbfree'), [
'type' => 'button',
'class' => 'btn btn-outline-danger',
'id' => 'meetlet-access-reset-modal-confirm',
+7 -7
View File
@@ -17,15 +17,15 @@
/**
* Admin setting: site-wide role × feature access matrix.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet <info@meetlet.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\admin;
namespace mod_meetletacbfree\admin;
use admin_setting;
use mod_meetletacbmarketplace\local\featureaccess;
use mod_meetletacbfree\local\featureaccess;
defined('MOODLE_INTERNAL') || die();
@@ -35,9 +35,9 @@ defined('MOODLE_INTERNAL') || die();
class setting_featureaccess extends admin_setting {
public function __construct() {
parent::__construct(
'meetletacbmarketplace/featureaccess',
get_string('featureaccess', 'meetletacbmarketplace'),
get_string('featureaccess_desc', 'meetletacbmarketplace'),
'meetletacbfree/featureaccess',
get_string('featureaccess', 'meetletacbfree'),
get_string('featureaccess_desc', 'meetletacbfree'),
json_encode(featureaccess::builtin_defaults(), JSON_UNESCAPED_UNICODE)
);
}
@@ -78,7 +78,7 @@ class setting_featureaccess extends admin_setting {
$this->description,
true,
'',
get_string('featureaccess_usesite', 'meetletacbmarketplace'),
get_string('featureaccess_usesite', 'meetletacbfree'),
$query
);
}
+45 -45
View File
@@ -4,16 +4,16 @@
/**
* Admin UI for voluntary MeetLet site registration (Marketplace free edition).
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\admin;
namespace mod_meetletacbfree\admin;
use admin_setting;
use mod_meetletacbmarketplace\local\icons;
use mod_meetletacbmarketplace\registration\manager;
use mod_meetletacbfree\local\icons;
use mod_meetletacbfree\registration\manager;
defined('MOODLE_INTERNAL') || die();
@@ -23,7 +23,7 @@ defined('MOODLE_INTERNAL') || die();
class setting_registration extends admin_setting {
public function __construct() {
parent::__construct(
'meetletacbmarketplace/registration_panel',
'meetletacbfree/registration_panel',
'',
'',
''
@@ -45,11 +45,11 @@ class setting_registration extends admin_setting {
$summary = manager::status_summary();
$active = !empty($summary['active']);
$candeactivate = !empty($summary['can_deactivate']);
$ajaxurl = new \moodle_url('/mod/meetletacbmarketplace/ajax/registration.php');
$scrolljsurl = new \moodle_url('/mod/meetletacbmarketplace/javascript/meetlet_modal_scroll.js', [
$ajaxurl = new \moodle_url('/mod/meetletacbfree/ajax/registration.php');
$scrolljsurl = new \moodle_url('/mod/meetletacbfree/javascript/meetlet_modal_scroll.js', [
'v' => '2026090146',
]);
$jsurl = new \moodle_url('/mod/meetletacbmarketplace/javascript/settings_registration.js', [
$jsurl = new \moodle_url('/mod/meetletacbfree/javascript/settings_registration.js', [
'v' => '2026090146',
]);
$privacytaburl = manager::privacy_tab_url();
@@ -58,37 +58,37 @@ class setting_registration extends admin_setting {
$statusbadge = \html_writer::span(
s($summary['status_label'] ?? ($active
? get_string('registration_status_active', 'meetletacbmarketplace')
: get_string('registration_status_inactive', 'meetletacbmarketplace'))),
? get_string('registration_status_active', 'meetletacbfree')
: get_string('registration_status_inactive', 'meetletacbfree'))),
'badge meetlet-license-badge ' . ($active ? 'meetlet-license-badge--active' : 'meetlet-license-badge--inactive'),
['id' => 'meetlet-registration-status-badge']
);
$datalist = \html_writer::tag('ul',
\html_writer::tag('li', get_string('registration_data_item_domain', 'meetletacbmarketplace', s($summary['domain']))) .
\html_writer::tag('li', get_string('registration_data_item_moodle', 'meetletacbmarketplace', s($summary['moodle_release']))) .
\html_writer::tag('li', get_string('registration_data_item_plugin', 'meetletacbmarketplace', s($summary['plugin_release']))) .
\html_writer::tag('li', get_string('registration_data_item_installation', 'meetletacbmarketplace', s($summary['installation_id']))) .
\html_writer::tag('li', get_string('registration_data_item_sitename', 'meetletacbmarketplace', s($summary['site_company']))) .
\html_writer::tag('li', get_string('registration_data_item_email', 'meetletacbmarketplace',
$summary['site_admin_email'] !== '' ? s($summary['site_admin_email']) : get_string('registration_data_optional', 'meetletacbmarketplace'))),
\html_writer::tag('li', get_string('registration_data_item_domain', 'meetletacbfree', s($summary['domain']))) .
\html_writer::tag('li', get_string('registration_data_item_moodle', 'meetletacbfree', s($summary['moodle_release']))) .
\html_writer::tag('li', get_string('registration_data_item_plugin', 'meetletacbfree', s($summary['plugin_release']))) .
\html_writer::tag('li', get_string('registration_data_item_installation', 'meetletacbfree', s($summary['installation_id']))) .
\html_writer::tag('li', get_string('registration_data_item_sitename', 'meetletacbfree', s($summary['site_company']))) .
\html_writer::tag('li', get_string('registration_data_item_email', 'meetletacbfree',
$summary['site_admin_email'] !== '' ? s($summary['site_admin_email']) : get_string('registration_data_optional', 'meetletacbfree'))),
['class' => 'meetlet-registration-data']
);
$why = \html_writer::div(
\html_writer::tag('h4', get_string('registration_why_title', 'meetletacbmarketplace')) .
\html_writer::tag('p', get_string('registration_why', 'meetletacbmarketplace')),
\html_writer::tag('h4', get_string('registration_why_title', 'meetletacbfree')) .
\html_writer::tag('p', get_string('registration_why', 'meetletacbfree')),
'meetlet-guide__section'
);
$what = \html_writer::div(
\html_writer::tag('h4', get_string('registration_data_title', 'meetletacbmarketplace')) .
\html_writer::tag('p', get_string('registration_data_sent', 'meetletacbmarketplace')) .
\html_writer::tag('h4', get_string('registration_data_title', 'meetletacbfree')) .
\html_writer::tag('p', get_string('registration_data_sent', 'meetletacbfree')) .
$datalist .
\html_writer::tag('p',
get_string(
'registration_privacy',
'meetletacbmarketplace',
\html_writer::link($privacytaburl, get_string('registration_privacy_tablink', 'meetletacbmarketplace'))
'meetletacbfree',
\html_writer::link($privacytaburl, get_string('registration_privacy_tablink', 'meetletacbfree'))
),
['class' => 'mb-0']
),
@@ -108,12 +108,12 @@ class setting_registration extends admin_setting {
$why .
$what .
\html_writer::div(
\html_writer::tag('p', get_string('registration_status_label', 'meetletacbmarketplace') . ' ' .
\html_writer::tag('p', get_string('registration_status_label', 'meetletacbfree') . ' ' .
\html_writer::span($statusbadge, '', ['id' => 'meetlet-registration-status-badge'])) .
\html_writer::tag('p', get_string('registration_domain', 'meetletacbmarketplace', s($summary['domain'])), [
\html_writer::tag('p', get_string('registration_domain', 'meetletacbfree', s($summary['domain'])), [
'id' => 'meetlet-registration-domain',
]) .
\html_writer::tag('p', get_string('registration_installation', 'meetletacbmarketplace', s($summary['installation_id'])), [
\html_writer::tag('p', get_string('registration_installation', 'meetletacbfree', s($summary['installation_id'])), [
'id' => 'meetlet-registration-installation',
]) .
\html_writer::tag('p', s($summary['product_label'] ?? ''), [
@@ -131,12 +131,12 @@ class setting_registration extends admin_setting {
\html_writer::tag('button',
'<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">'
. '<path fill="currentColor" d="M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4z"/></svg>'
. \html_writer::span(get_string('registration_activate', 'meetletacbmarketplace'), 'meetlet-btn-with-icon__label'),
. \html_writer::span(get_string('registration_activate', 'meetletacbfree'), 'meetlet-btn-with-icon__label'),
[
'type' => 'button',
'class' => 'meetlet-settings-btn meetlet-btn-with-icon meetlet-license-btn--free',
'id' => 'meetlet-registration-activate',
'title' => get_string('registration_activate_help', 'meetletacbmarketplace'),
'title' => get_string('registration_activate_help', 'meetletacbfree'),
]
),
'',
@@ -145,7 +145,7 @@ class setting_registration extends admin_setting {
\html_writer::div(
\html_writer::tag('button',
icons::svg('refresh')
. \html_writer::span(get_string('registration_recheck', 'meetletacbmarketplace'), 'meetlet-btn-with-icon__label'),
. \html_writer::span(get_string('registration_recheck', 'meetletacbfree'), 'meetlet-btn-with-icon__label'),
[
'type' => 'button',
'class' => 'btn btn-secondary meetlet-btn-with-icon',
@@ -156,7 +156,7 @@ class setting_registration extends admin_setting {
\html_writer::tag('button',
'<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">'
. '<path fill="currentColor" d="M12 2a10 10 0 1 0 10 10h-2a8 8 0 1 1-8-8V2zm1 5v5.6l3.2 1.9-.8 1.4L11 13.2V7h2z"/></svg>'
. \html_writer::span(get_string('registration_deactivate', 'meetletacbmarketplace'), 'meetlet-btn-with-icon__label'),
. \html_writer::span(get_string('registration_deactivate', 'meetletacbfree'), 'meetlet-btn-with-icon__label'),
[
'type' => 'button',
'class' => 'btn btn-outline-danger meetlet-btn-with-icon',
@@ -171,16 +171,16 @@ class setting_registration extends admin_setting {
'id' => 'meetlet-registration-config',
'data-ajaxurl' => $ajaxurl->out(false),
'data-sesskey' => sesskey(),
'data-api-input' => 'id_s_meetletacbmarketplace_registration_api_url',
'data-label-active' => get_string('registration_status_active', 'meetletacbmarketplace'),
'data-label-inactive' => get_string('registration_status_inactive', 'meetletacbmarketplace'),
'data-label-domain' => get_string('registration_domain', 'meetletacbmarketplace', '__V__'),
'data-label-installation' => get_string('registration_installation', 'meetletacbmarketplace', '__V__'),
'data-confirm-activate-title' => get_string('registration_activate_confirm_title', 'meetletacbmarketplace'),
'data-confirm-activate-ok' => get_string('registration_activate_confirm_ok', 'meetletacbmarketplace'),
'data-confirm-deactivate-title' => get_string('registration_deactivate_confirm_title', 'meetletacbmarketplace'),
'data-confirm-deactivate-ok' => get_string('registration_deactivate_confirm_ok', 'meetletacbmarketplace'),
'data-confirm-deactivate' => get_string('registration_deactivate_confirm', 'meetletacbmarketplace'),
'data-api-input' => 'id_s_meetletacbfree_registration_api_url',
'data-label-active' => get_string('registration_status_active', 'meetletacbfree'),
'data-label-inactive' => get_string('registration_status_inactive', 'meetletacbfree'),
'data-label-domain' => get_string('registration_domain', 'meetletacbfree', '__V__'),
'data-label-installation' => get_string('registration_installation', 'meetletacbfree', '__V__'),
'data-confirm-activate-title' => get_string('registration_activate_confirm_title', 'meetletacbfree'),
'data-confirm-activate-ok' => get_string('registration_activate_confirm_ok', 'meetletacbfree'),
'data-confirm-deactivate-title' => get_string('registration_deactivate_confirm_title', 'meetletacbfree'),
'data-confirm-deactivate-ok' => get_string('registration_deactivate_confirm_ok', 'meetletacbfree'),
'data-confirm-deactivate' => get_string('registration_deactivate_confirm', 'meetletacbfree'),
'hidden' => 'hidden',
]) .
self::confirm_modal_html(),
@@ -191,17 +191,17 @@ class setting_registration extends admin_setting {
}
protected static function confirm_modal_html(): string {
$activatebody = \html_writer::tag('p', get_string('registration_activate_confirm_lead', 'meetletacbmarketplace'), [
$activatebody = \html_writer::tag('p', get_string('registration_activate_confirm_lead', 'meetletacbfree'), [
'class' => 'meetlet-modal__lead',
]) .
\html_writer::tag('p', get_string('registration_activate_confirm_data', 'meetletacbmarketplace'), [
\html_writer::tag('p', get_string('registration_activate_confirm_data', 'meetletacbfree'), [
'class' => 'meetlet-modal__keep',
]);
$deactivatebody = \html_writer::tag('p', get_string('registration_deactivate_confirm_lead', 'meetletacbmarketplace'), [
$deactivatebody = \html_writer::tag('p', get_string('registration_deactivate_confirm_lead', 'meetletacbfree'), [
'class' => 'meetlet-modal__lead',
]) .
\html_writer::div(
\html_writer::tag('p', get_string('registration_deactivate_confirm_warning', 'meetletacbmarketplace'), [
\html_writer::tag('p', get_string('registration_deactivate_confirm_warning', 'meetletacbfree'), [
'class' => 'meetlet-modal__callout-title',
]),
'meetlet-modal__callout'
@@ -219,7 +219,7 @@ class setting_registration extends admin_setting {
'type' => 'button',
'class' => 'meetlet-modal__close',
'data-meetlet-modal-dismiss' => '1',
'aria-label' => get_string('registration_modal_close', 'meetletacbmarketplace'),
'aria-label' => get_string('registration_modal_close', 'meetletacbfree'),
]),
'meetlet-modal__head'
) .
+7 -7
View File
@@ -17,15 +17,15 @@
/**
* Admin setting: default Moodle role → Adobe Connect role mapping.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet <info@meetlet.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\admin;
namespace mod_meetletacbfree\admin;
use admin_setting;
use mod_meetletacbmarketplace\local\roles;
use mod_meetletacbfree\local\roles;
defined('MOODLE_INTERNAL') || die();
@@ -35,9 +35,9 @@ defined('MOODLE_INTERNAL') || die();
class setting_rolemapping extends admin_setting {
public function __construct() {
parent::__construct(
'meetletacbmarketplace/default_participants',
get_string('siterolemapping', 'meetletacbmarketplace'),
get_string('siterolemapping_desc', 'meetletacbmarketplace'),
'meetletacbfree/default_participants',
get_string('siterolemapping', 'meetletacbfree'),
get_string('siterolemapping_desc', 'meetletacbfree'),
json_encode(roles::builtin_site_defaults(), JSON_UNESCAPED_UNICODE)
);
}
@@ -81,7 +81,7 @@ class setting_rolemapping extends admin_setting {
$this->description,
true,
'',
get_string('siterolemapping_defaultinfo', 'meetletacbmarketplace'),
get_string('siterolemapping_defaultinfo', 'meetletacbfree'),
$query
);
}
+2 -2
View File
@@ -17,12 +17,12 @@
/**
* Admin settings tabs with a fixed hero above the tab bar.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\admin;
namespace mod_meetletacbfree\admin;
defined('MOODLE_INTERNAL') || die();
+13 -13
View File
@@ -17,14 +17,14 @@
/**
* Adobe Connect XML API client.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\api;
namespace mod_meetletacbfree\api;
use mod_meetletacbmarketplace\local\config;
use mod_meetletacbfree\local\config;
use moodle_exception;
use SimpleXMLElement;
@@ -58,11 +58,11 @@ class client {
* @return self
*/
public function login_admin(): self {
\mod_meetletacbmarketplace\registration\manager::require_registered();
\mod_meetletacbfree\registration\manager::require_registered();
$info = $this->request(['action' => 'common-info']);
$this->cookie = (string)($info->common->cookie ?? '');
if ($this->cookie === '') {
throw new moodle_exception('erroremptyxml', 'meetletacbmarketplace');
throw new moodle_exception('erroremptyxml', 'meetletacbfree');
}
$result = $this->request([
@@ -72,7 +72,7 @@ class client {
]);
if ((string)$result->status['code'] !== 'ok') {
throw new moodle_exception('errorlogin', 'meetletacbmarketplace');
throw new moodle_exception('errorlogin', 'meetletacbfree');
}
return $this;
@@ -85,7 +85,7 @@ class client {
* @return string BREEZESESSION cookie value
*/
public function login_external(string $connectlogin): string {
\mod_meetletacbmarketplace\registration\manager::require_registered();
\mod_meetletacbfree\registration\manager::require_registered();
$headername = config::get_http_auth_header();
$candidates = array_values(array_unique(array_filter([
@@ -113,7 +113,7 @@ class client {
'adobe_code' => (string)($lastfail['code'] ?? ''),
'adobe_subcode' => (string)($lastfail['subcode'] ?? 'no-login'),
];
throw new \mod_meetletacbmarketplace\local\usererror(
throw new \mod_meetletacbfree\local\usererror(
'sso_01',
'errorhttpauth',
array_filter($facts),
@@ -176,7 +176,7 @@ class client {
'login' => $login,
'code' => $code,
'subcode' => $sub,
'xml' => \mod_meetletacbmarketplace\local\usererror::format_xml($raw),
'xml' => \mod_meetletacbfree\local\usererror::format_xml($raw),
];
}
@@ -227,7 +227,7 @@ class client {
if ($result === false) {
$err = curl_error($ch);
curl_close($ch);
throw new moodle_exception('erroremptyxml', 'meetletacbmarketplace', '', null, $err);
throw new moodle_exception('erroremptyxml', 'meetletacbfree', '', null, $err);
}
curl_close($ch);
return (string)$result;
@@ -266,12 +266,12 @@ class client {
$body = ($xmlstart === false) ? $raw : substr($raw, $xmlstart);
if ($body === '' || $body === false) {
throw new moodle_exception('erroremptyxml', 'meetletacbmarketplace');
throw new moodle_exception('erroremptyxml', 'meetletacbfree');
}
$sx = @simplexml_load_string($body);
if ($sx === false) {
throw new moodle_exception('erroremptyxml', 'meetletacbmarketplace');
throw new moodle_exception('erroremptyxml', 'meetletacbfree');
}
return $sx;
@@ -377,7 +377,7 @@ class client {
if ($result === false) {
$err = curl_error($ch);
curl_close($ch);
throw new moodle_exception('erroremptyxml', 'meetletacbmarketplace', '', null, $err);
throw new moodle_exception('erroremptyxml', 'meetletacbfree', '', null, $err);
}
curl_close($ch);
return (string)$result;
+13 -13
View File
@@ -17,15 +17,15 @@
/**
* High-level Adobe Connect service operations.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\api;
namespace mod_meetletacbfree\api;
use cache;
use mod_meetletacbmarketplace\local\config;
use mod_meetletacbfree\local\config;
use moodle_exception;
use stdClass;
@@ -63,7 +63,7 @@ class service {
* Resolve a sco-shortcuts folder id (cached).
*/
public function get_folder_scoid(string $type): int {
$cache = cache::make('mod_meetletacbmarketplace', 'folders');
$cache = cache::make('mod_meetletacbfree', 'folders');
$key = 'folder_' . str_replace('-', '_', $type);
$cached = $cache->get($key);
if ($cached !== false && $cached !== null) {
@@ -92,7 +92,7 @@ class service {
* @return array scoid => name
*/
public function get_templates(): array {
$cache = cache::make('mod_meetletacbmarketplace', 'templates');
$cache = cache::make('mod_meetletacbfree', 'templates');
$cached = $cache->get('all');
if (is_array($cached)) {
return $cached;
@@ -142,7 +142,7 @@ class service {
$xml = $this->client->request($params);
if ((string)$xml->status['code'] !== 'ok') {
throw new moodle_exception('errorcreatemeeting', 'meetletacbmarketplace');
throw new moodle_exception('errorcreatemeeting', 'meetletacbfree');
}
$scoid = (int)$xml->sco['sco-id'];
$this->apply_meeting_options($scoid, $data);
@@ -165,7 +165,7 @@ class service {
$xml = $this->client->request($params);
$ok = (string)$xml->status['code'] === 'ok';
if ($ok) {
cache::make('mod_meetletacbmarketplace', 'meetinginfo')->delete((string)$scoid);
cache::make('mod_meetletacbfree', 'meetinginfo')->delete((string)$scoid);
$this->apply_meeting_options($scoid, $data);
}
return $ok;
@@ -557,7 +557,7 @@ class service {
* Prefer sco-info (fast) over sco-contents listing.
*/
public function meeting_info(int $scoid): ?stdClass {
$cache = cache::make('mod_meetletacbmarketplace', 'meetinginfo');
$cache = cache::make('mod_meetletacbfree', 'meetinginfo');
$cached = $cache->get((string)$scoid);
if (is_object($cached)) {
return $cached;
@@ -682,7 +682,7 @@ class service {
}
}
throw new moodle_exception('errorcreateuser', 'meetletacbmarketplace', '', null, $lastdetail);
throw new moodle_exception('errorcreateuser', 'meetletacbfree', '', null, $lastdetail);
}
/**
@@ -694,7 +694,7 @@ class service {
if ($this->is_reserved_connect_login((string)($adobeuser->login ?? ''))) {
throw new moodle_exception(
'errorcreateuser',
'meetletacbmarketplace',
'meetletacbfree',
'',
null,
'refusing to align reserved principal login=' . $adobeuser->login
@@ -1321,11 +1321,11 @@ class service {
}
foreach ($candidates as $key) {
$stringkey = 'contenticon_' . $key;
if (get_string_manager()->string_exists($stringkey, 'meetletacbmarketplace')) {
return get_string($stringkey, 'meetletacbmarketplace');
if (get_string_manager()->string_exists($stringkey, 'meetletacbfree')) {
return get_string($stringkey, 'meetletacbfree');
}
}
return $icon !== '' && $icon !== 'content' ? $icon : get_string('contenticon_content', 'meetletacbmarketplace');
return $icon !== '' && $icon !== 'content' ? $icon : get_string('contenticon_content', 'meetletacbfree');
}
/**
+3 -3
View File
@@ -14,20 +14,20 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace mod_meetletacbmarketplace\event;
namespace mod_meetletacbfree\event;
defined('MOODLE_INTERNAL') || die();
/**
* Course module viewed event.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class course_module_viewed extends \core\event\course_module_viewed {
protected function init() {
$this->data['objecttable'] = 'meetletacbmarketplace';
$this->data['objecttable'] = 'meetletacbfree';
$this->data['crud'] = 'r';
$this->data['edulevel'] = self::LEVEL_PARTICIPATING;
}
+5 -5
View File
@@ -14,26 +14,26 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace mod_meetletacbmarketplace\event;
namespace mod_meetletacbfree\event;
defined('MOODLE_INTERNAL') || die();
/**
* User joined a MeetLet meeting.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class meeting_joined extends \core\event\base {
protected function init() {
$this->data['objecttable'] = 'meetletacbmarketplace';
$this->data['objecttable'] = 'meetletacbfree';
$this->data['crud'] = 'r';
$this->data['edulevel'] = self::LEVEL_PARTICIPATING;
}
public static function get_name() {
return get_string('joinmeeting', 'meetletacbmarketplace');
return get_string('joinmeeting', 'meetletacbfree');
}
public function get_description() {
@@ -41,6 +41,6 @@ class meeting_joined extends \core\event\base {
}
public function get_url() {
return new \moodle_url('/mod/meetletacbmarketplace/view.php', ['id' => $this->contextinstanceid]);
return new \moodle_url('/mod/meetletacbfree/view.php', ['id' => $this->contextinstanceid]);
}
}
+13 -13
View File
@@ -17,25 +17,25 @@
/**
* Ajax: SSO URL to view uploaded meeting content in Adobe Connect.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet <info@meetlet.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\external;
namespace mod_meetletacbfree\external;
use core_external\external_api;
use core_external\external_function_parameters;
use core_external\external_single_structure;
use core_external\external_value;
use mod_meetletacbmarketplace\api\service;
use mod_meetletacbmarketplace\local\config;
use mod_meetletacbmarketplace\local\content;
use mod_meetletacbmarketplace\local\featureaccess;
use mod_meetletacbmarketplace\local\instance;
use mod_meetletacbmarketplace\local\roles;
use mod_meetletacbmarketplace\local\sso;
use mod_meetletacbmarketplace\local\usererror;
use mod_meetletacbfree\api\service;
use mod_meetletacbfree\local\config;
use mod_meetletacbfree\local\content;
use mod_meetletacbfree\local\featureaccess;
use mod_meetletacbfree\local\instance;
use mod_meetletacbfree\local\roles;
use mod_meetletacbfree\local\sso;
use mod_meetletacbfree\local\usererror;
use moodle_exception;
defined('MOODLE_INTERNAL') || die();
@@ -61,11 +61,11 @@ class get_content_launch_url extends external_api {
'groupid' => $groupid,
]);
\mod_meetletacbmarketplace\registration\manager::require_registered();
\mod_meetletacbfree\registration\manager::require_registered();
$inst = instance::get_from_cmid($params['cmid'], $params['groupid']);
self::validate_context($inst->context);
require_capability('mod/meetletacbmarketplace:view', $inst->context);
require_capability('mod/meetletacbfree:view', $inst->context);
featureaccess::require_feature(featureaccess::CONTENT, $inst->context, $inst->record);
$service = new service();
@@ -74,7 +74,7 @@ class get_content_launch_url extends external_api {
$service->logout();
if (!$item || empty($item->urlpath)) {
throw new moodle_exception('nocontent', 'meetletacbmarketplace');
throw new moodle_exception('nocontent', 'meetletacbfree');
}
try {
+19 -19
View File
@@ -17,23 +17,23 @@
/**
* Ajax: build SSO join URL.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\external;
namespace mod_meetletacbfree\external;
use core_external\external_api;
use core_external\external_function_parameters;
use core_external\external_single_structure;
use core_external\external_value;
use mod_meetletacbmarketplace\api\service;
use mod_meetletacbmarketplace\local\config;
use mod_meetletacbmarketplace\local\instance;
use mod_meetletacbmarketplace\local\roles;
use mod_meetletacbmarketplace\local\sso;
use mod_meetletacbmarketplace\local\usererror;
use mod_meetletacbfree\api\service;
use mod_meetletacbfree\local\config;
use mod_meetletacbfree\local\instance;
use mod_meetletacbfree\local\roles;
use mod_meetletacbfree\local\sso;
use mod_meetletacbfree\local\usererror;
use moodle_exception;
defined('MOODLE_INTERNAL') || die();
@@ -57,17 +57,17 @@ class get_join_url extends external_api {
'groupid' => $groupid,
]);
\mod_meetletacbmarketplace\registration\manager::require_registered();
\mod_meetletacbfree\registration\manager::require_registered();
$inst = instance::get_from_cmid($params['cmid'], $params['groupid']);
self::validate_context($inst->context);
require_capability('mod/meetletacbmarketplace:view', $inst->context);
if (!\mod_meetletacbmarketplace\local\featureaccess::allowed(
\mod_meetletacbmarketplace\local\featureaccess::JOIN,
require_capability('mod/meetletacbfree:view', $inst->context);
if (!\mod_meetletacbfree\local\featureaccess::allowed(
\mod_meetletacbfree\local\featureaccess::JOIN,
$inst->context,
$inst->record
)) {
throw new moodle_exception('notparticipant', 'meetletacbmarketplace');
throw new moodle_exception('notparticipant', 'meetletacbfree');
}
if ($inst->cm->groupmode != NOGROUPS) {
@@ -75,21 +75,21 @@ class get_join_url extends external_api {
$usrgroups = $usrgroups[0] ?? [];
$aag = has_capability('moodle/site:accessallgroups', $inst->context);
if (!$aag && $params['groupid'] && !in_array($params['groupid'], $usrgroups, false)) {
throw new moodle_exception('usergrouprequired', 'meetletacbmarketplace');
throw new moodle_exception('usergrouprequired', 'meetletacbfree');
}
}
$adoberole = roles::resolve_adobe_role($inst->record, $inst->context, $USER->id);
if ($adoberole === null) {
throw new moodle_exception('notparticipant', 'meetletacbmarketplace');
throw new moodle_exception('notparticipant', 'meetletacbfree');
}
try {
// Gate join before any Adobe user provisioning / SSO.
$lifecycle = \mod_meetletacbmarketplace\local\meetingstatus::resolve($inst, (int)$USER->id, true);
$lifecycle = \mod_meetletacbfree\local\meetingstatus::resolve($inst, (int)$USER->id, true);
if (empty($lifecycle['joinable'])) {
$code = !empty($lifecycle['errorcode']) ? $lifecycle['errorcode'] : 'meetingended';
throw new moodle_exception($code, 'meetletacbmarketplace');
throw new moodle_exception($code, 'meetletacbfree');
}
$scoid = $inst->require_meeting();
@@ -98,13 +98,13 @@ class get_join_url extends external_api {
$info = $service->meeting_info($scoid);
$service->logout();
if (!$info) {
throw new moodle_exception('nomeeting', 'meetletacbmarketplace');
throw new moodle_exception('nomeeting', 'meetletacbfree');
}
$auth = sso::provision_and_login($USER, $scoid, $adoberole);
$url = config::with_html_client(config::public_url($info->url, $auth['cookie']));
$event = \mod_meetletacbmarketplace\event\meeting_joined::create([
$event = \mod_meetletacbfree\event\meeting_joined::create([
'context' => $inst->context,
'objectid' => $inst->record->id,
'relateduserid' => $USER->id,
+7 -7
View File
@@ -17,20 +17,20 @@
/**
* Ajax: poll meeting join status.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\external;
namespace mod_meetletacbfree\external;
use core_external\external_api;
use core_external\external_function_parameters;
use core_external\external_single_structure;
use core_external\external_value;
use mod_meetletacbmarketplace\local\featureaccess;
use mod_meetletacbmarketplace\local\instance;
use mod_meetletacbmarketplace\local\meetingstatus;
use mod_meetletacbfree\local\featureaccess;
use mod_meetletacbfree\local\instance;
use mod_meetletacbfree\local\meetingstatus;
defined('MOODLE_INTERNAL') || die();
@@ -53,11 +53,11 @@ class get_meeting_status extends external_api {
'groupid' => $groupid,
]);
\mod_meetletacbmarketplace\registration\manager::require_registered();
\mod_meetletacbfree\registration\manager::require_registered();
$inst = instance::get_from_cmid($params['cmid'], $params['groupid']);
self::validate_context($inst->context);
require_capability('mod/meetletacbmarketplace:view', $inst->context);
require_capability('mod/meetletacbfree:view', $inst->context);
$info = meetingstatus::resolve($inst, (int)$USER->id, true);
$featurejoin = featureaccess::allowed(featureaccess::JOIN, $inst->context, $inst->record);
+14 -14
View File
@@ -17,24 +17,24 @@
/**
* Ajax: SSO URL to play or edit a recording in Adobe Connect.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet <info@meetlet.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\external;
namespace mod_meetletacbfree\external;
use core_external\external_api;
use core_external\external_function_parameters;
use core_external\external_single_structure;
use core_external\external_value;
use mod_meetletacbmarketplace\api\service;
use mod_meetletacbmarketplace\local\config;
use mod_meetletacbmarketplace\local\featureaccess;
use mod_meetletacbmarketplace\local\instance;
use mod_meetletacbmarketplace\local\roles;
use mod_meetletacbmarketplace\local\sso;
use mod_meetletacbmarketplace\local\usererror;
use mod_meetletacbfree\api\service;
use mod_meetletacbfree\local\config;
use mod_meetletacbfree\local\featureaccess;
use mod_meetletacbfree\local\instance;
use mod_meetletacbfree\local\roles;
use mod_meetletacbfree\local\sso;
use mod_meetletacbfree\local\usererror;
use moodle_exception;
defined('MOODLE_INTERNAL') || die();
@@ -64,26 +64,26 @@ class get_recording_launch_url extends external_api {
$mode = strtolower($params['mode']);
if (!in_array($mode, ['play', 'edit'], true)) {
throw new moodle_exception('error', 'meetletacbmarketplace');
throw new moodle_exception('error', 'meetletacbfree');
}
\mod_meetletacbmarketplace\registration\manager::require_registered();
\mod_meetletacbfree\registration\manager::require_registered();
$inst = instance::get_from_cmid($params['cmid'], $params['groupid']);
self::validate_context($inst->context);
require_capability('mod/meetletacbmarketplace:view', $inst->context);
require_capability('mod/meetletacbfree:view', $inst->context);
featureaccess::require_feature(featureaccess::RECORDINGS, $inst->context, $inst->record);
if ($mode === 'edit') {
featureaccess::require_feature(featureaccess::ADOBEEDITOR, $inst->context, $inst->record);
}
$record = $DB->get_record('meetlet_marketplace_recordings', [
$record = $DB->get_record('meetletacbfree_recordings', [
'instanceid' => $inst->record->id,
'recordingscoid' => $params['recordingscoid'],
]);
if (!$record || empty($record->urlpath)) {
throw new moodle_exception('norecordings', 'meetletacbmarketplace');
throw new moodle_exception('norecordings', 'meetletacbfree');
}
try {
+31 -31
View File
@@ -17,24 +17,24 @@
/**
* Ajax: load tab HTML/data.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\external;
namespace mod_meetletacbfree\external;
use core_external\external_api;
use core_external\external_function_parameters;
use core_external\external_single_structure;
use core_external\external_value;
use mod_meetletacbmarketplace\api\service;
use mod_meetletacbmarketplace\local\config;
use mod_meetletacbmarketplace\local\content;
use mod_meetletacbmarketplace\local\featureaccess;
use mod_meetletacbmarketplace\local\icons;
use mod_meetletacbmarketplace\local\instance;
use mod_meetletacbmarketplace\local\recordings;
use mod_meetletacbfree\api\service;
use mod_meetletacbfree\local\config;
use mod_meetletacbfree\local\content;
use mod_meetletacbfree\local\featureaccess;
use mod_meetletacbfree\local\icons;
use mod_meetletacbfree\local\instance;
use mod_meetletacbfree\local\recordings;
use moodle_exception;
defined('MOODLE_INTERNAL') || die();
@@ -60,16 +60,16 @@ class get_tab extends external_api {
'groupid' => $groupid,
]);
\mod_meetletacbmarketplace\registration\manager::require_registered();
\mod_meetletacbfree\registration\manager::require_registered();
$inst = instance::get_from_cmid($params['cmid'], $params['groupid']);
self::validate_context($inst->context);
require_capability('mod/meetletacbmarketplace:view', $inst->context);
require_capability('mod/meetletacbfree:view', $inst->context);
$PAGE->set_context($inst->context);
if (!config::is_configured()) {
return [
'html' => \html_writer::div(get_string('notconfigured', 'meetletacbmarketplace'), 'meetlet-alert'),
'html' => \html_writer::div(get_string('notconfigured', 'meetletacbfree'), 'meetlet-alert'),
'tab' => $params['tab'],
];
}
@@ -78,11 +78,11 @@ class get_tab extends external_api {
switch ($params['tab']) {
case 'details':
// Served locally in the activity page; keep endpoint defensive.
$html = \html_writer::div(get_string('emptydetails', 'meetletacbmarketplace'), 'meetlet-empty');
$html = \html_writer::div(get_string('emptydetails', 'meetletacbfree'), 'meetlet-empty');
break;
case 'info':
// Legacy tab id — no Adobe call.
$html = \html_writer::div(get_string('emptydetails', 'meetletacbmarketplace'), 'meetlet-empty');
$html = \html_writer::div(get_string('emptydetails', 'meetletacbfree'), 'meetlet-empty');
break;
case 'recordings':
featureaccess::require_feature(featureaccess::RECORDINGS, $inst->context, $inst->record);
@@ -93,7 +93,7 @@ class get_tab extends external_api {
$html = self::render_content($inst);
break;
default:
throw new moodle_exception('error', 'meetletacbmarketplace');
throw new moodle_exception('error', 'meetletacbfree');
}
return ['html' => $html, 'tab' => $params['tab']];
@@ -110,7 +110,7 @@ class get_tab extends external_api {
* Toolbar with refresh for cacheable Adobe tabs.
*/
protected static function wrap_refreshable(string $html, string $tab, bool $pending = false): string {
$refreshlabel = get_string('refreshtab', 'meetletacbmarketplace');
$refreshlabel = get_string('refreshtab', 'meetletacbfree');
$refreshcontent = icons::svg('refresh')
. \html_writer::span($refreshlabel, 'meetlet-btn-with-icon__label');
$bits = [
@@ -125,7 +125,7 @@ class get_tab extends external_api {
];
if ($pending) {
$bits[] = \html_writer::div(
\html_writer::span(get_string('jobpollwait', 'meetletacbmarketplace'), 'meetlet-jobpoll__label') .
\html_writer::span(get_string('jobpollwait', 'meetletacbfree'), 'meetlet-jobpoll__label') .
\html_writer::div(\html_writer::div('', 'meetlet-jobpoll__bar'), 'meetlet-jobpoll__track'),
'meetlet-jobpoll',
['aria-live' => 'polite']
@@ -206,7 +206,7 @@ class get_tab extends external_api {
$rows = recordings::for_tab($inst);
if (empty($rows)) {
return self::wrap_refreshable(
\html_writer::div(get_string('norecordings', 'meetletacbmarketplace'), 'meetlet-empty'),
\html_writer::div(get_string('norecordings', 'meetletacbfree'), 'meetlet-empty'),
'recordings'
);
}
@@ -215,21 +215,21 @@ class get_tab extends external_api {
$table = new \html_table();
$table->attributes['class'] = 'generaltable meetlet-table meetlet-table--recordings';
$table->head = [
get_string('recordingname', 'meetletacbmarketplace'),
get_string('recordingdate', 'meetletacbmarketplace'),
get_string('duration', 'meetletacbmarketplace'),
get_string('sessiondetails', 'meetletacbmarketplace'),
get_string('recordingname', 'meetletacbfree'),
get_string('recordingdate', 'meetletacbfree'),
get_string('duration', 'meetletacbfree'),
get_string('sessiondetails', 'meetletacbfree'),
];
foreach ($rows as $r) {
$actions = [];
$actions[] = self::icon_action('play', get_string('play', 'meetletacbmarketplace'), [
$actions[] = self::icon_action('play', get_string('play', 'meetletacbfree'), [
'class' => 'meetlet-iconbtn--play',
'data-action' => 'launch-recording',
'data-mode' => 'play',
'data-recording' => $r->recordingscoid,
]);
if ($canadobeedit && !empty($r->urlpath)) {
$actions[] = self::icon_action('adobeedit', get_string('adobeeditor', 'meetletacbmarketplace'), [
$actions[] = self::icon_action('adobeedit', get_string('adobeeditor', 'meetletacbfree'), [
'class' => 'meetlet-iconbtn--adobeedit',
'data-action' => 'launch-recording',
'data-mode' => 'edit',
@@ -257,7 +257,7 @@ class get_tab extends external_api {
if (!$canedit) {
return \html_writer::div($text, 'meetlet-recname');
}
$pencil = self::icon_action('edit', get_string('editrecording', 'meetletacbmarketplace'), [
$pencil = self::icon_action('edit', get_string('editrecording', 'meetletacbfree'), [
'class' => 'meetlet-iconbtn--edit meetlet-iconbtn--inline',
'data-action' => 'inline-rename',
]);
@@ -283,7 +283,7 @@ class get_tab extends external_api {
$service->logout();
if (empty($items)) {
return self::wrap_refreshable(
\html_writer::div(get_string('nocontent', 'meetletacbmarketplace'), 'meetlet-empty'),
\html_writer::div(get_string('nocontent', 'meetletacbfree'), 'meetlet-empty'),
'content'
);
}
@@ -291,10 +291,10 @@ class get_tab extends external_api {
$table->attributes['class'] = 'generaltable meetlet-table meetlet-table--content';
$table->head = [
get_string('name'),
get_string('contenttype', 'meetletacbmarketplace'),
get_string('contentsize', 'meetletacbmarketplace'),
get_string('contentdate', 'meetletacbmarketplace'),
get_string('sessiondetails', 'meetletacbmarketplace'),
get_string('contenttype', 'meetletacbfree'),
get_string('contentsize', 'meetletacbfree'),
get_string('contentdate', 'meetletacbfree'),
get_string('sessiondetails', 'meetletacbfree'),
];
foreach ($items as $item) {
$scoid = (int)($item->scoid ?? 0);
@@ -307,7 +307,7 @@ class get_tab extends external_api {
];
if ($scoid > 0 && !empty($item->name)) {
$dlurl = content::download_url((int)$USER->id, (int)$inst->cm->id, $scoid)->out(false);
$actions[] = self::icon_action('download', get_string('downloadcontent', 'meetletacbmarketplace'), [
$actions[] = self::icon_action('download', get_string('downloadcontent', 'meetletacbfree'), [
'href' => $dlurl,
'class' => 'meetlet-iconbtn--download',
'target' => '_self',
+13 -13
View File
@@ -17,19 +17,19 @@
/**
* Ajax: rename a recording SCO.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\external;
namespace mod_meetletacbfree\external;
use core_external\external_api;
use core_external\external_function_parameters;
use core_external\external_single_structure;
use core_external\external_value;
use mod_meetletacbmarketplace\api\service;
use mod_meetletacbmarketplace\local\instance;
use mod_meetletacbfree\api\service;
use mod_meetletacbfree\local\instance;
use moodle_exception;
defined('MOODLE_INTERNAL') || die();
@@ -57,20 +57,20 @@ class rename_recording extends external_api {
'groupid' => $groupid,
]);
\mod_meetletacbmarketplace\registration\manager::require_registered();
\mod_meetletacbfree\registration\manager::require_registered();
$inst = instance::get_from_cmid($params['cmid'], $params['groupid']);
self::validate_context($inst->context);
require_capability('mod/meetletacbmarketplace:view', $inst->context);
\mod_meetletacbmarketplace\local\featureaccess::require_feature(
\mod_meetletacbmarketplace\local\featureaccess::EDITRECORDING,
require_capability('mod/meetletacbfree:view', $inst->context);
\mod_meetletacbfree\local\featureaccess::require_feature(
\mod_meetletacbfree\local\featureaccess::EDITRECORDING,
$inst->context,
$inst->record
);
$name = trim($params['name']);
if ($name === '') {
throw new moodle_exception('error', 'meetletacbmarketplace');
throw new moodle_exception('error', 'meetletacbfree');
}
$service = new service();
@@ -78,23 +78,23 @@ class rename_recording extends external_api {
$ok = $service->rename_sco((int)$params['recordingscoid'], $name);
$service->logout();
if (!$ok) {
throw new moodle_exception('errorrenamerecording', 'meetletacbmarketplace');
throw new moodle_exception('errorrenamerecording', 'meetletacbfree');
}
$record = $DB->get_record('meetlet_marketplace_recordings', [
$record = $DB->get_record('meetletacbfree_recordings', [
'instanceid' => $inst->record->id,
'recordingscoid' => (int)$params['recordingscoid'],
]);
if ($record) {
$record->name = $name;
$record->timemodified = time();
$DB->update_record('meetlet_marketplace_recordings', $record);
$DB->update_record('meetletacbfree_recordings', $record);
}
return [
'success' => true,
'name' => $name,
'message' => get_string('recordingrenamed', 'meetletacbmarketplace'),
'message' => get_string('recordingrenamed', 'meetletacbfree'),
];
}
+7 -7
View File
@@ -17,20 +17,20 @@
/**
* Ajax: search/list existing Adobe meetings for the mod form.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\external;
namespace mod_meetletacbfree\external;
use core_external\external_api;
use core_external\external_function_parameters;
use core_external\external_multiple_structure;
use core_external\external_single_structure;
use core_external\external_value;
use mod_meetletacbmarketplace\api\service;
use mod_meetletacbmarketplace\local\config;
use mod_meetletacbfree\api\service;
use mod_meetletacbfree\local\config;
use moodle_exception;
defined('MOODLE_INTERNAL') || die();
@@ -54,7 +54,7 @@ class search_server_meetings extends external_api {
'courseid' => $courseid,
]);
\mod_meetletacbmarketplace\registration\manager::require_registered();
\mod_meetletacbfree\registration\manager::require_registered();
if (!empty($params['courseid'])) {
$context = \context_course::instance((int)$params['courseid']);
@@ -63,12 +63,12 @@ class search_server_meetings extends external_api {
}
self::validate_context($context);
if (!has_capability('moodle/course:manageactivities', $context)
&& !has_capability('mod/meetletacbmarketplace:addinstance', $context)) {
&& !has_capability('mod/meetletacbfree:addinstance', $context)) {
throw new moodle_exception('nopermissions', 'error', '', 'search meetings');
}
if (!config::is_configured()) {
throw new moodle_exception('notconfigured', 'meetletacbmarketplace');
throw new moodle_exception('notconfigured', 'meetletacbfree');
}
$limit = max(1, min(50, (int)$params['limit']));
+25 -25
View File
@@ -17,12 +17,12 @@
/**
* Plugin config helpers.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\local;
namespace mod_meetletacbfree\local;
/**
* Read MeetLet / Adobe Connect global settings.
@@ -38,35 +38,35 @@ class config {
* API endpoint URL (may already include https://.../api/xml).
*/
public static function get_api_url(): string {
return trim((string)get_config('meetletacbmarketplace', 'host'));
return trim((string)get_config('meetletacbfree', 'host'));
}
/**
* Meeting host domain (no protocol).
*/
public static function get_meet_host(): string {
return trim((string)get_config('meetletacbmarketplace', 'meethost'));
return trim((string)get_config('meetletacbfree', 'meethost'));
}
public static function get_port(): int {
$port = (int)get_config('meetletacbmarketplace', 'port');
$port = (int)get_config('meetletacbfree', 'port');
return $port > 0 ? $port : 443;
}
public static function use_https(): bool {
return (bool)get_config('meetletacbmarketplace', 'https');
return (bool)get_config('meetletacbfree', 'https');
}
public static function get_admin_login(): string {
return (string)get_config('meetletacbmarketplace', 'admin_login');
return (string)get_config('meetletacbfree', 'admin_login');
}
public static function get_admin_password(): string {
return (string)get_config('meetletacbmarketplace', 'admin_password');
return (string)get_config('meetletacbfree', 'admin_password');
}
public static function get_http_auth_header(): string {
$h = trim((string)get_config('meetletacbmarketplace', 'admin_httpauth'));
$h = trim((string)get_config('meetletacbfree', 'admin_httpauth'));
return $h !== '' ? $h : 'Generate-Safe-Random-Token';
}
@@ -75,7 +75,7 @@ class config {
* and realign them to mlu{id}. SSO identity itself is always Moodle id.
*/
public static function use_email_login(): bool {
return (bool)get_config('meetletacbmarketplace', 'email_login');
return (bool)get_config('meetletacbfree', 'email_login');
}
/**
@@ -86,14 +86,14 @@ class config {
if (!self::offline_render_active()) {
return false;
}
return (bool)get_config('meetletacbmarketplace', 'auto_offline');
return (bool)get_config('meetletacbfree', 'auto_offline');
}
/**
* Minutes between recording-sync / auto-MP4 cron runs (1–60, default 5).
*/
public static function cron_interval_minutes(): int {
$v = (int)get_config('meetletacbmarketplace', 'cron_interval');
$v = (int)get_config('meetletacbfree', 'cron_interval');
if ($v < 1) {
$v = 5;
}
@@ -114,7 +114,7 @@ class config {
* How auto-MP4 jobs are handed to the Agent.
*/
public static function agent_dispatch_mode(): string {
$v = trim((string)get_config('meetletacbmarketplace', 'agent_dispatch'));
$v = trim((string)get_config('meetletacbfree', 'agent_dispatch'));
return $v === self::DISPATCH_WINDOW ? self::DISPATCH_WINDOW : self::DISPATCH_IMMEDIATE;
}
@@ -124,7 +124,7 @@ class config {
* @return int[]
*/
public static function agent_dispatch_hours(): array {
$raw = (string)get_config('meetletacbmarketplace', 'agent_dispatch_hours');
$raw = (string)get_config('meetletacbfree', 'agent_dispatch_hours');
if ($raw === '') {
$raw = self::DEFAULT_DISPATCH_HOURS;
}
@@ -200,7 +200,7 @@ class config {
public static function apply_cron_interval(): void {
global $DB;
$mins = self::cron_interval_minutes();
$row = $DB->get_record('task_scheduled', ['classname' => '\\mod_meetletacbmarketplace\\task\\sync_recordings']);
$row = $DB->get_record('task_scheduled', ['classname' => '\\mod_meetletacbfree\\task\\sync_recordings']);
if (!$row) {
return;
}
@@ -221,14 +221,14 @@ class config {
* Configured Render Agent / offline listener base URL (may be empty).
*/
public static function agent_url(): string {
return trim((string)get_config('meetletacbmarketplace', 'agent_url'));
return trim((string)get_config('meetletacbfree', 'agent_url'));
}
/**
* Site-wide default meeting UI language (Adobe Connect), empty = server default.
*/
public static function default_meeting_lang(): string {
$v = get_config('meetletacbmarketplace', 'default_meetinglang');
$v = get_config('meetletacbfree', 'default_meetinglang');
if ($v === false || $v === null) {
return '';
}
@@ -239,7 +239,7 @@ class config {
* Site-wide default: block participants until host joins.
*/
public static function default_wait_for_host(): bool {
return (bool)get_config('meetletacbmarketplace', 'default_waitforhost');
return (bool)get_config('meetletacbfree', 'default_waitforhost');
}
/**
@@ -249,7 +249,7 @@ class config {
*/
public static function meeting_lang_options(): array {
return [
'' => get_string('meetinglang_default', 'meetletacbmarketplace'),
'' => get_string('meetinglang_default', 'meetletacbfree'),
'en' => 'English',
'fa' => 'فارسی',
'ar' => 'العربية',
@@ -286,9 +286,9 @@ class config {
return false;
}
$key = 'enable_' . $feature;
$v = get_config('meetletacbmarketplace', $key);
$v = get_config('meetletacbfree', $key);
if ($v === false && $feature === 'mp4') {
$legacy = get_config('meetletacbmarketplace', 'allow_manual_offline');
$legacy = get_config('meetletacbfree', 'allow_manual_offline');
return $legacy === false ? true : (bool)$legacy;
}
// ZIP is opt-in; other features default on when unset.
@@ -305,7 +305,7 @@ class config {
*/
public static function feature_allow_override(string $feature): bool {
$key = 'allow_override_' . $feature;
$v = get_config('meetletacbmarketplace', $key);
$v = get_config('meetletacbfree', $key);
return $v === false ? true : (bool)$v;
}
@@ -367,9 +367,9 @@ class config {
*/
public static function override_state_options(): array {
return [
self::OVERRIDE_INHERIT => get_string('settingstate_inherit', 'meetletacbmarketplace'),
self::OVERRIDE_OFF => get_string('settingstate_disable', 'meetletacbmarketplace'),
self::OVERRIDE_ON => get_string('settingstate_enable', 'meetletacbmarketplace'),
self::OVERRIDE_INHERIT => get_string('settingstate_inherit', 'meetletacbfree'),
self::OVERRIDE_OFF => get_string('settingstate_disable', 'meetletacbfree'),
self::OVERRIDE_ON => get_string('settingstate_enable', 'meetletacbfree'),
];
}
+22 -22
View File
@@ -17,18 +17,18 @@
/**
* Stepwise Adobe Connect connection tests for admin Ajax UI.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\local;
namespace mod_meetletacbfree\local;
defined('MOODLE_INTERNAL') || die();
use mod_meetletacbmarketplace\api\client;
use mod_meetletacbmarketplace\api\service;
use mod_meetletacbmarketplace\local\usererror;
use mod_meetletacbfree\api\client;
use mod_meetletacbfree\api\service;
use mod_meetletacbfree\local\usererror;
use Throwable;
/**
@@ -42,7 +42,7 @@ class conntest_runner {
*/
public static function reset(): void {
global $SESSION;
$SESSION->meetletacbmarketplace_conntest = [
$SESSION->meetletacbfree_conntest = [
'service' => null,
'meetings' => null,
'scoid' => null,
@@ -58,19 +58,19 @@ class conntest_runner {
public static function run_step(string $step): array {
global $SESSION;
\mod_meetletacbmarketplace\registration\manager::require_registered();
\mod_meetletacbfree\registration\manager::require_registered();
if (empty($SESSION->meetletacbmarketplace_conntest) || $step === 'login') {
if (empty($SESSION->meetletacbfree_conntest) || $step === 'login') {
self::reset();
}
$state = &$SESSION->meetletacbmarketplace_conntest;
$state = &$SESSION->meetletacbfree_conntest;
if (!config::is_configured()) {
return [
'step' => $step,
'label' => get_string('error', 'meetletacbmarketplace'),
'label' => get_string('error', 'meetletacbfree'),
'ok' => false,
'detail' => get_string('notconfigured', 'meetletacbmarketplace'),
'detail' => get_string('notconfigured', 'meetletacbfree'),
'done' => true,
'abort' => true,
];
@@ -91,7 +91,7 @@ class conntest_runner {
default:
return [
'step' => $step,
'label' => get_string('error', 'meetletacbmarketplace'),
'label' => get_string('error', 'meetletacbfree'),
'ok' => false,
'detail' => 'Unknown step',
'done' => true,
@@ -102,7 +102,7 @@ class conntest_runner {
$state['failed'] = true;
return [
'step' => $step,
'label' => get_string('error', 'meetletacbmarketplace'),
'label' => get_string('error', 'meetletacbfree'),
'ok' => false,
'detail' => $e->getMessage(),
'done' => false,
@@ -127,7 +127,7 @@ class conntest_runner {
$service->logout();
return [
'step' => 'login',
'label' => get_string('testlogin', 'meetletacbmarketplace'),
'label' => get_string('testlogin', 'meetletacbfree'),
'ok' => true,
'detail' => '',
'done' => false,
@@ -148,7 +148,7 @@ class conntest_runner {
$service->logout();
return [
'step' => 'folders',
'label' => get_string('testfolders', 'meetletacbmarketplace'),
'label' => get_string('testfolders', 'meetletacbfree'),
'ok' => (bool)$ok,
'detail' => "content={$content} · archives={$archives} · meetings={$meetings}",
'done' => false,
@@ -189,7 +189,7 @@ class conntest_runner {
}
return [
'step' => 'user',
'label' => get_string('testuser', 'meetletacbmarketplace'),
'label' => get_string('testuser', 'meetletacbfree'),
'ok' => (bool)$assigned,
'detail' => '',
'done' => false,
@@ -204,18 +204,18 @@ class conntest_runner {
$sso = new client();
$cookie = $sso->login_external(config::get_admin_login());
$directok = ($cookie !== '');
$directdetail = get_string('testsso_direct_ok', 'meetletacbmarketplace');
$directdetail = get_string('testsso_direct_ok', 'meetletacbfree');
} catch (Throwable $e) {
$msg = $e->getMessage();
$directdetail = get_string('testsso_direct_fail', 'meetletacbmarketplace', usererror::label('sso_01') . ': ' . $msg);
$directdetail = get_string('testsso_direct_fail', 'meetletacbfree', usererror::label('sso_01') . ': ' . $msg);
}
if ($directok && !empty($state['login'])) {
try {
$sso2 = new client();
$sso2->login_external($state['login']);
$directdetail .= ' · ' . get_string('testsso_userok', 'meetletacbmarketplace');
$directdetail .= ' · ' . get_string('testsso_userok', 'meetletacbfree');
} catch (Throwable $e) {
$directdetail .= ' · ' . get_string('testsso_userwarn', 'meetletacbmarketplace');
$directdetail .= ' · ' . get_string('testsso_userwarn', 'meetletacbfree');
}
}
@@ -225,7 +225,7 @@ class conntest_runner {
return [
'step' => 'sso',
'label' => get_string('testsso', 'meetletacbmarketplace'),
'label' => get_string('testsso', 'meetletacbfree'),
'ok' => $directok,
'detail' => $directdetail,
'done' => false,
@@ -253,7 +253,7 @@ class conntest_runner {
self::reset();
return [
'step' => 'cleanup',
'label' => get_string('testmeeting', 'meetletacbmarketplace'),
'label' => get_string('testmeeting', 'meetletacbfree'),
'ok' => $ok,
'detail' => $detail,
'done' => true,
+12 -12
View File
@@ -17,14 +17,14 @@
/**
* Meeting content download helpers (Adobe Connect proxy).
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet <info@meetlet.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\local;
namespace mod_meetletacbfree\local;
use mod_meetletacbmarketplace\api\service;
use mod_meetletacbfree\api\service;
use stdClass;
defined('MOODLE_INTERNAL') || die();
@@ -37,7 +37,7 @@ class content {
* Opaque, HMAC-signed, current-user download URL.
*/
public static function download_url(int $userid, int $cmid, int $scoid): \moodle_url {
return new \moodle_url('/mod/meetletacbmarketplace/download_content.php', [
return new \moodle_url('/mod/meetletacbfree/download_content.php', [
'k' => self::make_download_token($userid, $cmid, $scoid),
]);
}
@@ -50,7 +50,7 @@ class content {
public static function unpack_download_token(string $token): array {
$token = trim($token);
if (!preg_match('/^[A-Za-z0-9_-]+$/', $token)) {
throw new \moodle_exception('errorbadcontenttoken', 'meetletacbmarketplace');
throw new \moodle_exception('errorbadcontenttoken', 'meetletacbfree');
}
$b64 = strtr($token, '-_', '+/');
$pad = strlen($b64) % 4;
@@ -59,12 +59,12 @@ class content {
}
$raw = base64_decode($b64, true);
if ($raw === false || strlen($raw) < 44) {
throw new \moodle_exception('errorbadcontenttoken', 'meetletacbmarketplace');
throw new \moodle_exception('errorbadcontenttoken', 'meetletacbfree');
}
$mac = substr($raw, 0, 32);
$payload = substr($raw, 32);
if (strlen($payload) < 32) {
throw new \moodle_exception('errorbadcontenttoken', 'meetletacbmarketplace');
throw new \moodle_exception('errorbadcontenttoken', 'meetletacbfree');
}
$ids = unpack('Nuid/Ncmid/Ncid/Nexp', substr($payload, 0, 16));
@@ -75,15 +75,15 @@ class content {
$expires = (int)$ids['exp'];
$expected = hash_hmac(
'sha256',
'meetletacbmarketplace-content-v1|' . $userid . ':' . $cmid . ':' . $cid . ':' . $expires . '|' . $nonce,
'meetletacbfree-content-v1|' . $userid . ':' . $cmid . ':' . $cid . ':' . $expires . '|' . $nonce,
self::download_secret(),
true
);
if (!hash_equals($expected, $mac)) {
throw new \moodle_exception('errorbadcontenttoken', 'meetletacbmarketplace');
throw new \moodle_exception('errorbadcontenttoken', 'meetletacbfree');
}
if ($expires < time() || $userid <= 0 || $cmid <= 0 || $cid <= 0) {
throw new \moodle_exception('errorbadcontenttoken', 'meetletacbmarketplace');
throw new \moodle_exception('errorbadcontenttoken', 'meetletacbfree');
}
return ['userid' => $userid, 'cmid' => $cmid, 'cid' => $cid];
}
@@ -183,7 +183,7 @@ class content {
$payload = pack('N4', $userid, $cmid, $scoid, $expires) . $nonce;
$mac = hash_hmac(
'sha256',
'meetletacbmarketplace-content-v1|' . $userid . ':' . $cmid . ':' . $scoid . ':' . $expires . '|' . $nonce,
'meetletacbfree-content-v1|' . $userid . ':' . $cmid . ':' . $scoid . ':' . $expires . '|' . $nonce,
self::download_secret(),
true
);
@@ -191,6 +191,6 @@ class content {
}
protected static function download_secret(): string {
return 'mod_meetletacbmarketplace/content/' . get_site_identifier();
return 'mod_meetletacbfree/content/' . get_site_identifier();
}
}
+15 -15
View File
@@ -17,12 +17,12 @@
/**
* Role-based feature access matrix (site + activity).
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\local;
namespace mod_meetletacbfree\local;
use context;
use stdClass;
@@ -42,7 +42,7 @@ defined('MOODLE_INTERNAL') || die();
* AND optional site/activity visibility switch when mapped.
*
* Do NOT grant access via Moodle capabilities alone (except the base
* mod/meetletacbmarketplace:view gate to open the activity page).
* mod/meetletacbfree:view gate to open the activity page).
* Do NOT special-case admins/hosts outside the matrix.
*
* Adding a new feature:
@@ -245,7 +245,7 @@ class featureaccess {
* Whether the activity form may show a per-activity access matrix.
*/
public static function activity_override_enabled(): bool {
$raw = get_config('meetletacbmarketplace', 'activity_featureaccess');
$raw = get_config('meetletacbfree', 'activity_featureaccess');
if ($raw === false || $raw === null || $raw === '') {
return true;
}
@@ -302,7 +302,7 @@ class featureaccess {
* @return array<string,array<string,int>>
*/
public static function site_matrix(): array {
$raw = get_config('meetletacbmarketplace', 'featureaccess');
$raw = get_config('meetletacbfree', 'featureaccess');
if ($raw === false || $raw === null || $raw === '') {
return self::builtin_defaults();
}
@@ -374,7 +374,7 @@ class featureaccess {
* Use this for tabs, buttons, links, and web-service actions.
*/
public static function allowed(string $feature, context $context, ?stdClass $activity = null, ?int $userid = null): bool {
if (!\mod_meetletacbmarketplace\registration\manager::is_registered()) {
if (!\mod_meetletacbfree\registration\manager::is_registered()) {
return false;
}
$vis = self::visibility_feature($feature);
@@ -388,21 +388,21 @@ class featureaccess {
* Require allowed() or throw.
*/
public static function require_feature(string $feature, context $context, ?stdClass $activity = null): void {
\mod_meetletacbmarketplace\registration\manager::require_registered();
\mod_meetletacbfree\registration\manager::require_registered();
if (self::allowed($feature, $context, $activity)) {
return;
}
$vis = self::visibility_feature($feature);
if ($vis !== null && !config::show_feature($vis, $activity)) {
throw new \moodle_exception('featuredisabled', 'meetletacbmarketplace');
throw new \moodle_exception('featuredisabled', 'meetletacbfree');
}
throw new \moodle_exception('nopermissions', 'error', '', self::feature_label($feature));
}
public static function feature_label(string $feature): string {
$key = 'accessfeature_' . $feature;
if (get_string_manager()->string_exists($key, 'meetletacbmarketplace')) {
return get_string($key, 'meetletacbmarketplace');
if (get_string_manager()->string_exists($key, 'meetletacbfree')) {
return get_string($key, 'meetletacbfree');
}
return $feature;
}
@@ -430,7 +430,7 @@ class featureaccess {
}
protected static function view_capability_for_context(context $context): string {
return 'mod/meetletacbmarketplace:view';
return 'mod/meetletacbfree:view';
}
/**
@@ -444,14 +444,14 @@ class featureaccess {
$matrix = self::normalize($matrix);
$roles = self::role_labels();
$features = self::feature_labels();
$strtogglerow = get_string('accessmatrix_toggle_row', 'meetletacbmarketplace');
$strtogglecol = get_string('accessmatrix_toggle_col', 'meetletacbmarketplace');
$strall = get_string('accessmatrix_all', 'meetletacbmarketplace');
$strtogglerow = get_string('accessmatrix_toggle_row', 'meetletacbfree');
$strtogglecol = get_string('accessmatrix_toggle_col', 'meetletacbfree');
$strall = get_string('accessmatrix_all', 'meetletacbfree');
$html = \html_writer::start_div('meetlet-access-matrix', ['data-meetlet-access-matrix' => '1']);
$html .= \html_writer::start_tag('table', ['class' => 'generaltable meetlet-access-table']);
$head = \html_writer::tag('th', get_string('accessrole', 'meetletacbmarketplace'));
$head = \html_writer::tag('th', get_string('accessrole', 'meetletacbfree'));
foreach ($features as $fkey => $flabel) {
$toggle = \html_writer::tag('button', s($strall), [
'type' => 'button',
+2 -2
View File
@@ -17,12 +17,12 @@
/**
* Local inline SVG icons (air-gapped — no CDN).
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\local;
namespace mod_meetletacbfree\local;
defined('MOODLE_INTERNAL') || die();
+8 -8
View File
@@ -17,12 +17,12 @@
/**
* Activity instance helpers.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\local;
namespace mod_meetletacbfree\local;
use cm_info;
use context_module;
@@ -49,12 +49,12 @@ class instance {
public $meetingmap;
public static function get_from_cmid(int $cmid, int $groupid = 0): self {
list($course, $cm) = get_course_and_cm_from_cmid($cmid, 'meetletacbmarketplace');
list($course, $cm) = get_course_and_cm_from_cmid($cmid, 'meetletacbfree');
return self::from_cm($cm, $course, $groupid);
}
public static function get_from_instanceid(int $instanceid, int $groupid = 0): self {
list($course, $cm) = get_course_and_cm_from_instance($instanceid, 'meetletacbmarketplace');
list($course, $cm) = get_course_and_cm_from_instance($instanceid, 'meetletacbfree');
return self::from_cm($cm, $course, $groupid);
}
@@ -64,15 +64,15 @@ class instance {
$inst->cm = $cm;
$inst->course = $course;
$inst->context = context_module::instance($cm->id);
$inst->record = $DB->get_record('meetletacbmarketplace', ['id' => $cm->instance], '*', MUST_EXIST);
$inst->record = $DB->get_record('meetletacbfree', ['id' => $cm->instance], '*', MUST_EXIST);
$inst->groupid = $groupid;
$inst->meetingmap = $DB->get_record('meetlet_marketplace_meetings', [
$inst->meetingmap = $DB->get_record('meetletacbfree_meetings', [
'instanceid' => $inst->record->id,
'groupid' => $groupid,
]);
if (!$inst->meetingmap && $groupid !== 0) {
// Fallback to no-group mapping.
$inst->meetingmap = $DB->get_record('meetlet_marketplace_meetings', [
$inst->meetingmap = $DB->get_record('meetletacbfree_meetings', [
'instanceid' => $inst->record->id,
'groupid' => 0,
]);
@@ -87,7 +87,7 @@ class instance {
public function require_meeting(): int {
$scoid = $this->meetingscoid();
if (!$scoid) {
throw new moodle_exception('nomeeting', 'meetletacbmarketplace');
throw new moodle_exception('nomeeting', 'meetletacbfree');
}
return $scoid;
}
+19 -19
View File
@@ -17,14 +17,14 @@
/**
* Meeting lifecycle status (schedule + live presence + wait-for-host).
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\local;
namespace mod_meetletacbfree\local;
use mod_meetletacbmarketplace\api\service;
use mod_meetletacbfree\api\service;
defined('MOODLE_INTERNAL') || die();
@@ -74,30 +74,30 @@ class meetingstatus {
$status = self::CHECKING;
$errorcode = '';
$message = get_string('statuschecking_help', 'meetletacbmarketplace');
$message = get_string('statuschecking_help', 'meetletacbfree');
// Never allow join before Adobe confirms room state.
$joinable = false;
if ($endts > 0 && $endts < $now) {
$status = self::ENDED;
$message = get_string('meetingended', 'meetletacbmarketplace');
$message = get_string('meetingended', 'meetletacbfree');
$errorcode = 'meetingended';
$joinable = $canbypass;
} else if ($startts > $now) {
$status = self::SCHEDULED;
$message = get_string('meetingnotstarted', 'meetletacbmarketplace');
$message = get_string('meetingnotstarted', 'meetletacbfree');
$errorcode = 'meetingnotstarted';
$joinable = $canbypass;
} else if ($waitforhost && !$canbypass) {
// Provisional: assume waiting until Adobe poll confirms a live/open room.
$status = self::WAITINGHOST;
$message = get_string('joinblocked_waitinghost', 'meetletacbmarketplace');
$message = get_string('joinblocked_waitinghost', 'meetletacbfree');
$errorcode = 'waitingforhost';
$joinable = false;
} else if (!$canbypass) {
// Until Adobe confirms the room is live, keep Join disabled for participants.
$status = self::CHECKING;
$message = get_string('statuschecking_help', 'meetletacbmarketplace');
$message = get_string('statuschecking_help', 'meetletacbfree');
$joinable = false;
}
@@ -190,14 +190,14 @@ class meetingstatus {
if (!$canbypass) {
$joinable = false;
$errorcode = 'meetingended';
$message = get_string('meetingended', 'meetletacbmarketplace');
$message = get_string('meetingended', 'meetletacbfree');
}
} else if ($startts > $now) {
$status = self::SCHEDULED;
if (!$canbypass) {
$joinable = false;
$errorcode = 'meetingnotstarted';
$message = get_string('meetingnotstarted', 'meetletacbmarketplace');
$message = get_string('meetingnotstarted', 'meetletacbfree');
}
} else if (!$islive && $checkhost && !$canbypass) {
// Nobody is in the Adobe room yet. Participants must not get a join URL —
@@ -206,12 +206,12 @@ class meetingstatus {
$status = self::WAITINGHOST;
$joinable = false;
$errorcode = 'waitingforhost';
$message = get_string('joinblocked_waitinghost', 'meetletacbmarketplace');
$message = get_string('joinblocked_waitinghost', 'meetletacbfree');
} else if (!$islive && $canbypass && ($waitforhost || $adobehold)) {
// Host/moderator may enter; still show waiting-for-host for clarity.
$status = self::WAITINGHOST;
$joinable = true;
$message = get_string('joinblocked_waitinghost', 'meetletacbmarketplace');
$message = get_string('joinblocked_waitinghost', 'meetletacbfree');
}
if ($service instanceof service) {
@@ -236,7 +236,7 @@ class meetingstatus {
'status' => $status,
'statuslabel' => self::label($status),
'joinable' => $joinable,
'message' => $message !== '' ? $message : get_string('statushelp', 'meetletacbmarketplace'),
'message' => $message !== '' ? $message : get_string('statushelp', 'meetletacbfree'),
'errorcode' => $errorcode,
'starttime' => $startts,
'endtime' => $endts,
@@ -247,17 +247,17 @@ class meetingstatus {
public static function label(string $status): string {
switch ($status) {
case self::LIVE:
return get_string('statuslive', 'meetletacbmarketplace');
return get_string('statuslive', 'meetletacbfree');
case self::ENDED:
return get_string('statusended', 'meetletacbmarketplace');
return get_string('statusended', 'meetletacbfree');
case self::SCHEDULED:
return get_string('statusscheduled', 'meetletacbmarketplace');
return get_string('statusscheduled', 'meetletacbfree');
case self::WAITINGHOST:
return get_string('statuswaitinghost', 'meetletacbmarketplace');
return get_string('statuswaitinghost', 'meetletacbfree');
case self::CHECKING:
return get_string('statuschecking', 'meetletacbmarketplace');
return get_string('statuschecking', 'meetletacbfree');
default:
return get_string('statusopen', 'meetletacbmarketplace');
return get_string('statusopen', 'meetletacbfree');
}
}
}
+4 -4
View File
@@ -17,12 +17,12 @@
/**
* Admin HTML for the in-plugin privacy policy tab (Marketplace edition).
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\local;
namespace mod_meetletacbfree\local;
defined('MOODLE_INTERNAL') || die();
@@ -35,7 +35,7 @@ class privacy_policy {
* Build privacy policy HTML (safe for admin settings heading).
*/
public static function render(): string {
$plugin = 'meetletacbmarketplace';
$plugin = 'meetletacbfree';
$sections = [
self::section('scope', 'privacy_tab_scope_title', 'privacy_tab_scope_body'),
@@ -67,7 +67,7 @@ class privacy_policy {
* @param string $bodykey Lang string key or pre-formatted body HTML.
*/
protected static function section(string $id, string $titlekey, string $bodykey): string {
$plugin = 'meetletacbmarketplace';
$plugin = 'meetletacbfree';
$title = get_string($titlekey, $plugin);
$body = strpos($bodykey, '<') !== false
? $bodykey
+7 -7
View File
@@ -17,14 +17,14 @@
/**
* Recording list sync (community edition — no offline MP4 / agent).
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet <info@meetlet.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\local;
namespace mod_meetletacbfree\local;
use mod_meetletacbmarketplace\api\service;
use mod_meetletacbfree\api\service;
use stdClass;
defined('MOODLE_INTERNAL') || die();
@@ -58,7 +58,7 @@ class recordings {
$out = [];
foreach ($remote as $rec) {
$record = $DB->get_record('meetlet_marketplace_recordings', [
$record = $DB->get_record('meetletacbfree_recordings', [
'instanceid' => $instance->record->id,
'recordingscoid' => $rec->scoid,
]);
@@ -77,7 +77,7 @@ class recordings {
$record->timestart = $rec->datebegin ? strtotime($rec->datebegin) : 0;
$record->timeend = $rec->dateend ? strtotime($rec->dateend) : 0;
$record->timemodified = $now;
$record->id = $DB->insert_record('meetlet_marketplace_recordings', $record);
$record->id = $DB->insert_record('meetletacbfree_recordings', $record);
} else {
$record->name = $rec->name;
$record->urlpath = $rec->urlpath;
@@ -86,7 +86,7 @@ class recordings {
$record->timestart = $rec->datebegin ? strtotime($rec->datebegin) : 0;
$record->timeend = $rec->dateend ? strtotime($rec->dateend) : 0;
$record->timemodified = $now;
$DB->update_record('meetlet_marketplace_recordings', $record);
$DB->update_record('meetletacbfree_recordings', $record);
}
$record->playurl = config::public_url($rec->urlpath);
@@ -104,7 +104,7 @@ class recordings {
global $DB;
$rows = $DB->get_records(
'meetlet_marketplace_recordings',
'meetletacbfree_recordings',
['instanceid' => $instance->record->id],
'timestart DESC, id DESC'
);
+18 -18
View File
@@ -17,15 +17,15 @@
/**
* BBB-style participant role mapping for Adobe Connect.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\local;
namespace mod_meetletacbfree\local;
use context;
use mod_meetletacbmarketplace\api\service;
use mod_meetletacbfree\api\service;
use stdClass;
defined('MOODLE_INTERNAL') || die();
@@ -101,7 +101,7 @@ class roles {
* Site-wide default participant rules from plugin config (or built-in).
*/
public static function get_site_default_rules(): array {
$raw = get_config('meetletacbmarketplace', 'default_participants');
$raw = get_config('meetletacbfree', 'default_participants');
if (is_string($raw) && $raw !== '') {
$decoded = json_decode($raw, true);
if (is_array($decoded) && !empty($decoded)) {
@@ -251,9 +251,9 @@ class roles {
*/
public static function adobe_role_labels(): array {
return [
self::ROLE_HOST => get_string('role_host', 'meetletacbmarketplace'),
self::ROLE_PRESENTER => get_string('role_presenter', 'meetletacbmarketplace'),
self::ROLE_PARTICIPANT => get_string('role_participant', 'meetletacbmarketplace'),
self::ROLE_HOST => get_string('role_host', 'meetletacbfree'),
self::ROLE_PRESENTER => get_string('role_presenter', 'meetletacbfree'),
self::ROLE_PARTICIPANT => get_string('role_participant', 'meetletacbfree'),
];
}
@@ -270,14 +270,14 @@ class roles {
'class' => 'generaltable meetlet-access-table meetlet-rolemapping-table',
]);
$head = \html_writer::tag('th', get_string('accessrole', 'meetletacbmarketplace'));
$head .= \html_writer::tag('th', get_string('adoberole', 'meetletacbmarketplace'));
$head = \html_writer::tag('th', get_string('accessrole', 'meetletacbfree'));
$head .= \html_writer::tag('th', get_string('adoberole', 'meetletacbfree'));
$html .= \html_writer::tag('thead', \html_writer::tag('tr', $head));
$body = '';
// Everyone row first.
$body .= self::mapping_row_html(
get_string('participant_type_all', 'meetletacbmarketplace'),
get_string('participant_type_all', 'meetletacbfree'),
$inputname . '[_all]',
$matrix['_all'] ?? self::ROLE_PARTICIPANT,
$adobelabels,
@@ -387,15 +387,15 @@ class roles {
public static function get_participant_data(context $context, ?stdClass $instance = null): array {
$data = [
'all' => [
'name' => get_string('participant_type_all', 'meetletacbmarketplace'),
'name' => get_string('participant_type_all', 'meetletacbfree'),
'children' => [],
],
'role' => [
'name' => get_string('participant_type_role', 'meetletacbmarketplace'),
'name' => get_string('participant_type_role', 'meetletacbfree'),
'children' => self::get_roles_select($context),
],
'user' => [
'name' => get_string('participant_type_user', 'meetletacbmarketplace'),
'name' => get_string('participant_type_user', 'meetletacbfree'),
'children' => [],
],
];
@@ -426,9 +426,9 @@ class roles {
public static function get_participant_selection_data(): array {
return [
'type_options' => [
'all' => get_string('participant_type_all', 'meetletacbmarketplace'),
'role' => get_string('participant_type_role', 'meetletacbmarketplace'),
'user' => get_string('participant_type_user', 'meetletacbmarketplace'),
'all' => get_string('participant_type_all', 'meetletacbfree'),
'role' => get_string('participant_type_role', 'meetletacbfree'),
'user' => get_string('participant_type_user', 'meetletacbfree'),
],
'type_selected' => 'role',
'options' => ['all' => '---------------'],
@@ -442,10 +442,10 @@ class roles {
* @return string|null Adobe permission-id or null if denied
*/
public static function resolve_adobe_role(stdClass $instance, context $context, int $userid): ?string {
if (has_capability('mod/meetletacbmarketplace:host', $context, $userid)) {
if (has_capability('mod/meetletacbfree:host', $context, $userid)) {
return service::ROLE_HOST;
}
if (has_capability('mod/meetletacbmarketplace:presenter', $context, $userid)) {
if (has_capability('mod/meetletacbfree:presenter', $context, $userid)) {
return service::ROLE_PRESENTER;
}
+6 -6
View File
@@ -17,17 +17,17 @@
/**
* Track Adobe Connect room occupancy for auto MP4 after the class actually ends.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\local;
namespace mod_meetletacbfree\local;
defined('MOODLE_INTERNAL') || die();
/**
* Persist live/closed room state on meetlet_marketplace_meetings and decide when to sweep recordings.
* Persist live/closed room state on meetletacbfree_meetings and decide when to sweep recordings.
*/
class roomsession {
/** Seconds to keep looking for new recordings after the room empties. */
@@ -48,7 +48,7 @@ class roomsession {
if (!$map || empty($map->id)) {
return false;
}
$row = $DB->get_record('meetlet_marketplace_meetings', ['id' => (int)$map->id]);
$row = $DB->get_record('meetletacbfree_meetings', ['id' => (int)$map->id]);
if (!$row) {
return false;
}
@@ -59,7 +59,7 @@ class roomsession {
if ($islive) {
$row->islive = 1;
$row->liveat = $now;
$DB->update_record('meetlet_marketplace_meetings', $row);
$DB->update_record('meetletacbfree_meetings', $row);
$instance->meetingmap = $row;
return false;
}
@@ -78,7 +78,7 @@ class roomsession {
$row->sweptat = $now;
}
if ($waslive || $due) {
$DB->update_record('meetlet_marketplace_meetings', $row);
$DB->update_record('meetletacbfree_meetings', $row);
}
$instance->meetingmap = $row;
return $due;
+4 -4
View File
@@ -17,12 +17,12 @@
/**
* Admin HTML for Adobe Connect server setup guide.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\local;
namespace mod_meetletacbfree\local;
defined('MOODLE_INTERNAL') || die();
@@ -34,7 +34,7 @@ class server_guide {
* Build guide HTML (safe for admin settings heading).
*/
public static function render(): string {
$plugin = 'meetletacbmarketplace';
$plugin = 'meetletacbfree';
$match = \html_writer::tag('h4', get_string('serverguide_match_title', $plugin)) .
\html_writer::tag('p', get_string('serverguide_match_intro', $plugin)) .
@@ -97,7 +97,7 @@ class server_guide {
* Help-code table so an admin can match a student-reported ML- code.
*/
protected static function errorcodes_section(): string {
$plugin = 'meetletacbmarketplace';
$plugin = 'meetletacbfree';
$head = \html_writer::tag('tr',
\html_writer::tag('th', get_string('serverguide_errorcodes_col_code', $plugin)) .
\html_writer::tag('th', get_string('serverguide_errorcodes_col_meaning', $plugin)) .
+6 -6
View File
@@ -17,15 +17,15 @@
/**
* Adobe Connect SSO helpers for the current Moodle user.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet <info@meetlet.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\local;
namespace mod_meetletacbfree\local;
use mod_meetletacbmarketplace\api\client;
use mod_meetletacbmarketplace\api\service;
use mod_meetletacbfree\api\client;
use mod_meetletacbfree\api\service;
use moodle_exception;
use stdClass;
@@ -76,7 +76,7 @@ class sso {
* @param string[] $logincandidates
*/
public static function breeze_session(array $logincandidates): string {
\mod_meetletacbmarketplace\registration\manager::require_registered();
\mod_meetletacbfree\registration\manager::require_registered();
$cookie = '';
$lasterror = null;
@@ -138,7 +138,7 @@ class sso {
* @return array{cookie:string,adobeuser:stdClass}
*/
public static function provision_and_login(stdClass $user, int $scoid, string $permission): array {
\mod_meetletacbmarketplace\registration\manager::require_registered();
\mod_meetletacbfree\registration\manager::require_registered();
$service = new service();
$service->login_admin();
+20 -20
View File
@@ -17,12 +17,12 @@
/**
* Audience-aware MeetLet errors (student vs teacher/admin) with help codes.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\local;
namespace mod_meetletacbfree\local;
use moodle_exception;
@@ -55,7 +55,7 @@ class usererror extends moodle_exception {
if ($this->xml !== '') {
$debug['xml'] = $this->xml;
}
parent::__construct($errorcode, 'meetletacbmarketplace', '', null, json_encode($debug, JSON_UNESCAPED_UNICODE));
parent::__construct($errorcode, 'meetletacbfree', '', null, json_encode($debug, JSON_UNESCAPED_UNICODE));
}
/**
@@ -66,9 +66,9 @@ class usererror extends moodle_exception {
'moodle/site:config',
'moodle/course:update',
'moodle/course:manageactivities',
'mod/meetletacbmarketplace:addinstance',
'mod/meetletacbmarketplace:host',
'mod/meetletacbmarketplace:presenter',
'mod/meetletacbfree:addinstance',
'mod/meetletacbfree:host',
'mod/meetletacbfree:presenter',
], $context, $userid);
}
@@ -147,7 +147,7 @@ class usererror extends moodle_exception {
if (!$staff) {
return [
'code' => $label,
'message' => get_string('error_user_unavailable', 'meetletacbmarketplace', $label),
'message' => get_string('error_user_unavailable', 'meetletacbfree', $label),
'detailhtml' => '',
'staff' => false,
];
@@ -312,13 +312,13 @@ class usererror extends moodle_exception {
protected static function staff_title(string $helpid, \Throwable $e): string {
$cat = self::catalog();
$key = $cat[$helpid]['titlekey'] ?? '';
if ($key !== '' && get_string_manager()->string_exists($key, 'meetletacbmarketplace')) {
return get_string($key, 'meetletacbmarketplace');
if ($key !== '' && get_string_manager()->string_exists($key, 'meetletacbfree')) {
return get_string($key, 'meetletacbfree');
}
if ($e instanceof moodle_exception) {
return $e->getMessage();
}
return get_string('error', 'meetletacbmarketplace');
return get_string('error', 'meetletacbfree');
}
/**
@@ -330,12 +330,12 @@ class usererror extends moodle_exception {
$cat = self::catalog();
$titlekey = $cat[$helpid]['titlekey'] ?? '';
$fixkey = $cat[$helpid]['fixkey'] ?? '';
$title = ($titlekey !== '' && get_string_manager()->string_exists($titlekey, 'meetletacbmarketplace'))
? get_string($titlekey, 'meetletacbmarketplace')
: get_string('error', 'meetletacbmarketplace');
$title = ($titlekey !== '' && get_string_manager()->string_exists($titlekey, 'meetletacbfree'))
? get_string($titlekey, 'meetletacbfree')
: get_string('error', 'meetletacbfree');
$codebox = \html_writer::div(
\html_writer::span(get_string('error_helpcode_label', 'meetletacbmarketplace'), 'meetlet-err__codelabel') .
\html_writer::span(get_string('error_helpcode_label', 'meetletacbfree'), 'meetlet-err__codelabel') .
\html_writer::tag('code', s($label), ['data-copy-code' => $label]),
'meetlet-err__codebox'
);
@@ -348,8 +348,8 @@ class usererror extends moodle_exception {
continue;
}
$dtkey = 'errorfact_' . $key;
$dt = get_string_manager()->string_exists($dtkey, 'meetletacbmarketplace')
? get_string($dtkey, 'meetletacbmarketplace')
$dt = get_string_manager()->string_exists($dtkey, 'meetletacbfree')
? get_string($dtkey, 'meetletacbfree')
: $key;
$rows .= \html_writer::tag(
'div',
@@ -372,17 +372,17 @@ class usererror extends moodle_exception {
$factshtml = $rows !== '' ? \html_writer::tag('dl', $rows, ['class' => 'meetlet-err__facts']) : '';
$fix = '';
if ($fixkey !== '' && get_string_manager()->string_exists($fixkey, 'meetletacbmarketplace')) {
$fix = \html_writer::div(get_string($fixkey, 'meetletacbmarketplace'), 'meetlet-err__fix');
if ($fixkey !== '' && get_string_manager()->string_exists($fixkey, 'meetletacbfree')) {
$fix = \html_writer::div(get_string($fixkey, 'meetletacbfree'), 'meetlet-err__fix');
}
$xmlhtml = '';
if ($parsed['xml'] !== '') {
$xmlhtml = \html_writer::tag('p', get_string('error_adobe_response', 'meetletacbmarketplace'), ['class' => 'meetlet-err__prelabel']) .
$xmlhtml = \html_writer::tag('p', get_string('error_adobe_response', 'meetletacbfree'), ['class' => 'meetlet-err__prelabel']) .
\html_writer::tag('pre', s($parsed['xml']), ['class' => 'meetlet-err__xml']);
}
$guide = \html_writer::tag('p', get_string('error_see_serverguide', 'meetletacbmarketplace'), ['class' => 'meetlet-err__guide']);
$guide = \html_writer::tag('p', get_string('error_see_serverguide', 'meetletacbfree'), ['class' => 'meetlet-err__guide']);
return \html_writer::div(
\html_writer::tag('p', s($title), ['class' => 'meetlet-err__lead']) .
+3 -3
View File
@@ -17,12 +17,12 @@
/**
* Plugin renderer.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\output;
namespace mod_meetletacbfree\output;
use plugin_renderer_base;
@@ -33,6 +33,6 @@ defined('MOODLE_INTERNAL') || die();
*/
class renderer extends plugin_renderer_base {
public function render_view_page(view_page $page): string {
return $this->render_from_template('mod_meetletacbmarketplace/view_page', $page->export_for_template($this));
return $this->render_from_template('mod_meetletacbfree/view_page', $page->export_for_template($this));
}
}
+19 -19
View File
@@ -17,17 +17,17 @@
/**
* View page renderable.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\output;
namespace mod_meetletacbfree\output;
use mod_meetletacbmarketplace\local\featureaccess;
use mod_meetletacbmarketplace\local\icons;
use mod_meetletacbmarketplace\local\instance;
use mod_meetletacbmarketplace\local\meetingstatus;
use mod_meetletacbfree\local\featureaccess;
use mod_meetletacbfree\local\icons;
use mod_meetletacbfree\local\instance;
use mod_meetletacbfree\local\meetingstatus;
use renderable;
use renderer_base;
use templatable;
@@ -69,11 +69,11 @@ class view_page implements renderable, templatable {
$startts = (int)$lifecycle['starttime'];
$endts = (int)$lifecycle['endtime'];
$intro = format_module_intro('meetletacbmarketplace', $rec, $this->instance->cm->id);
$intro = format_module_intro('meetletacbfree', $rec, $this->instance->cm->id);
$tabs = [
[
'id' => 'details',
'label' => get_string('tabdetails', 'meetletacbmarketplace'),
'label' => get_string('tabdetails', 'meetletacbfree'),
'icon' => icons::svg('details'),
'active' => true,
],
@@ -81,7 +81,7 @@ class view_page implements renderable, templatable {
if (featureaccess::allowed(featureaccess::RECORDINGS, $this->instance->context, $rec)) {
$tabs[] = [
'id' => 'recordings',
'label' => get_string('tabrecordings', 'meetletacbmarketplace'),
'label' => get_string('tabrecordings', 'meetletacbfree'),
'icon' => icons::svg('recordings'),
'active' => false,
];
@@ -89,7 +89,7 @@ class view_page implements renderable, templatable {
if (featureaccess::allowed(featureaccess::CONTENT, $this->instance->context, $rec)) {
$tabs[] = [
'id' => 'content',
'label' => get_string('tabcontent', 'meetletacbmarketplace'),
'label' => get_string('tabcontent', 'meetletacbfree'),
'icon' => icons::svg('content'),
'active' => false,
];
@@ -104,12 +104,12 @@ class view_page implements renderable, templatable {
'name' => format_string($rec->name),
'intro' => $intro,
'hasintro' => trim(strip_tags($intro)) !== '',
'detailstitle' => get_string('tabdetails', 'meetletacbmarketplace'),
'emptydetails' => get_string('emptydetails', 'meetletacbmarketplace'),
'detailstitle' => get_string('tabdetails', 'meetletacbfree'),
'emptydetails' => get_string('emptydetails', 'meetletacbfree'),
'configured' => $this->configured,
'notconfiguredmsg' => get_string('notconfigured', 'meetletacbmarketplace'),
'subtitle' => get_string('subtitle', 'meetletacbmarketplace'),
'logourl' => $output->image_url('adobeconnect', 'meetletacbmarketplace')->out(false),
'notconfiguredmsg' => get_string('notconfigured', 'meetletacbfree'),
'subtitle' => get_string('subtitle', 'meetletacbfree'),
'logourl' => $output->image_url('adobeconnect', 'meetletacbfree')->out(false),
'status' => $status,
'statuslabel' => $statuslabel,
'statusmessage' => (string)$lifecycle['message'],
@@ -117,10 +117,10 @@ class view_page implements renderable, templatable {
'endtime' => $endts ? userdate($endts) : '',
'hasend' => !empty($endts),
'tabs' => $tabs,
'loading' => get_string('loading', 'meetletacbmarketplace'),
'joining' => get_string('joining', 'meetletacbmarketplace'),
'joiningtitle' => get_string('joiningtitle', 'meetletacbmarketplace'),
'joinlabel' => get_string('joinmeeting', 'meetletacbmarketplace'),
'loading' => get_string('loading', 'meetletacbfree'),
'joining' => get_string('joining', 'meetletacbfree'),
'joiningtitle' => get_string('joiningtitle', 'meetletacbfree'),
'joinlabel' => get_string('joinmeeting', 'meetletacbfree'),
'canjoin' => $featurejoin,
'joinable' => $joinable,
'statuspollseconds' => $this->registrationusable ? 15 : 0,
+45 -45
View File
@@ -15,14 +15,14 @@
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Privacy API for mod_meetletacbmarketplace.
* Privacy API for mod_meetletacbfree.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet <info@meetlet.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\privacy;
namespace mod_meetletacbfree\privacy;
defined('MOODLE_INTERNAL') || die();
@@ -54,26 +54,26 @@ class provider implements
* @return collection
*/
public static function get_metadata(collection $collection): collection {
$collection->add_database_table('meetletacbmarketplace', [
'userid' => 'privacy:metadata:meetletacbmarketplace:userid',
'name' => 'privacy:metadata:meetletacbmarketplace:name',
'intro' => 'privacy:metadata:meetletacbmarketplace:intro',
'participants' => 'privacy:metadata:meetletacbmarketplace:participants',
'timecreated' => 'privacy:metadata:meetletacbmarketplace:timecreated',
'timemodified' => 'privacy:metadata:meetletacbmarketplace:timemodified',
], 'privacy:metadata:meetletacbmarketplace');
$collection->add_database_table('meetletacbfree', [
'userid' => 'privacy:metadata:meetletacbfree:userid',
'name' => 'privacy:metadata:meetletacbfree:name',
'intro' => 'privacy:metadata:meetletacbfree:intro',
'participants' => 'privacy:metadata:meetletacbfree:participants',
'timecreated' => 'privacy:metadata:meetletacbfree:timecreated',
'timemodified' => 'privacy:metadata:meetletacbfree:timemodified',
], 'privacy:metadata:meetletacbfree');
$collection->add_database_table('meetlet_marketplace_meetings', [
'groupid' => 'privacy:metadata:meetlet_marketplace_meetings:groupid',
'meetingscoid' => 'privacy:metadata:meetlet_marketplace_meetings:meetingscoid',
'urlpath' => 'privacy:metadata:meetlet_marketplace_meetings:urlpath',
], 'privacy:metadata:meetlet_marketplace_meetings');
$collection->add_database_table('meetletacbfree_meetings', [
'groupid' => 'privacy:metadata:meetletacbfree_meetings:groupid',
'meetingscoid' => 'privacy:metadata:meetletacbfree_meetings:meetingscoid',
'urlpath' => 'privacy:metadata:meetletacbfree_meetings:urlpath',
], 'privacy:metadata:meetletacbfree_meetings');
$collection->add_database_table('meetlet_marketplace_recordings', [
'name' => 'privacy:metadata:meetlet_marketplace_recordings:name',
'urlpath' => 'privacy:metadata:meetlet_marketplace_recordings:urlpath',
'jobstatus' => 'privacy:metadata:meetlet_marketplace_recordings:jobstatus',
], 'privacy:metadata:meetlet_marketplace_recordings');
$collection->add_database_table('meetletacbfree_recordings', [
'name' => 'privacy:metadata:meetletacbfree_recordings:name',
'urlpath' => 'privacy:metadata:meetletacbfree_recordings:urlpath',
'jobstatus' => 'privacy:metadata:meetletacbfree_recordings:jobstatus',
], 'privacy:metadata:meetletacbfree_recordings');
$collection->add_external_location_link('adobeconnect', [
'firstname' => 'privacy:metadata:adobeconnect:firstname',
@@ -82,11 +82,11 @@ class provider implements
'username' => 'privacy:metadata:adobeconnect:username',
], 'privacy:metadata:adobeconnect');
$collection->add_database_table('meetlet_marketplace_license', [
'installation_id' => 'privacy:metadata:meetlet_marketplace_license:installation_id',
'status' => 'privacy:metadata:meetlet_marketplace_license:status',
'last_validated' => 'privacy:metadata:meetlet_marketplace_license:last_validated',
], 'privacy:metadata:meetlet_marketplace_license');
$collection->add_database_table('meetletacbfree_license', [
'installation_id' => 'privacy:metadata:meetletacbfree_license:installation_id',
'status' => 'privacy:metadata:meetletacbfree_license:status',
'last_validated' => 'privacy:metadata:meetletacbfree_license:last_validated',
], 'privacy:metadata:meetletacbfree_license');
$collection->add_external_location_link('meetlet_registration', [
'domain' => 'privacy:metadata:meetlet_registration:domain',
@@ -115,11 +115,11 @@ class provider implements
FROM {context} c
JOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = :contextlevel
JOIN {modules} m ON m.id = cm.module AND m.name = :modname
JOIN {meetletacbmarketplace} a ON a.id = cm.instance
JOIN {meetletacbfree} a ON a.id = cm.instance
WHERE a.userid = :userid";
$contextlist->add_from_sql($sql, [
'contextlevel' => CONTEXT_MODULE,
'modname' => 'meetletacbmarketplace',
'modname' => 'meetletacbfree',
'userid' => $userid,
]);
@@ -131,12 +131,12 @@ class provider implements
FROM {context} c
JOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = :contextlevel
JOIN {modules} m ON m.id = cm.module AND m.name = :modname
JOIN {meetletacbmarketplace} a ON a.id = cm.instance
JOIN {meetletacbfree} a ON a.id = cm.instance
WHERE " . $DB->sql_like('a.participants', ':pat1') . "
OR " . $DB->sql_like('a.participants', ':pat2');
$contextlist->add_from_sql($sql, [
'contextlevel' => CONTEXT_MODULE,
'modname' => 'meetletacbmarketplace',
'modname' => 'meetletacbfree',
'pat1' => $pat1,
'pat2' => $pat2,
]);
@@ -157,12 +157,12 @@ class provider implements
$params = [
'instanceid' => $context->instanceid,
'modulename' => 'meetletacbmarketplace',
'modulename' => 'meetletacbfree',
];
$sql = "SELECT a.userid
FROM {course_modules} cm
JOIN {modules} m ON m.id = cm.module AND m.name = :modulename
JOIN {meetletacbmarketplace} a ON a.id = cm.instance
JOIN {meetletacbfree} a ON a.id = cm.instance
WHERE cm.id = :instanceid AND a.userid <> 0";
$userlist->add_from_sql('userid', $sql, $params);
@@ -171,7 +171,7 @@ class provider implements
"SELECT a.participants
FROM {course_modules} cm
JOIN {modules} m ON m.id = cm.module AND m.name = :modulename
JOIN {meetletacbmarketplace} a ON a.id = cm.instance
JOIN {meetletacbfree} a ON a.id = cm.instance
WHERE cm.id = :instanceid",
$params
);
@@ -209,11 +209,11 @@ class provider implements
if ($context->contextlevel !== CONTEXT_MODULE) {
continue;
}
$cm = get_coursemodule_from_id('meetletacbmarketplace', $context->instanceid);
$cm = get_coursemodule_from_id('meetletacbfree', $context->instanceid);
if (!$cm) {
continue;
}
$activity = $DB->get_record('meetletacbmarketplace', ['id' => $cm->instance]);
$activity = $DB->get_record('meetletacbfree', ['id' => $cm->instance]);
if (!$activity) {
continue;
}
@@ -226,7 +226,7 @@ class provider implements
'is_creator' => ((int)$activity->userid === $userid),
'timecreated' => empty($activity->timecreated) ? null : transform::datetime($activity->timecreated),
'timemodified' => empty($activity->timemodified) ? null : transform::datetime($activity->timemodified),
'adobeconnect_note' => get_string('privacy:export:adobeconnect', 'meetletacbmarketplace'),
'adobeconnect_note' => get_string('privacy:export:adobeconnect', 'meetletacbfree'),
];
$userrules = [];
@@ -263,18 +263,18 @@ class provider implements
if (!$context instanceof \context_module) {
return;
}
$cm = get_coursemodule_from_id('meetletacbmarketplace', $context->instanceid);
$cm = get_coursemodule_from_id('meetletacbfree', $context->instanceid);
if (!$cm) {
return;
}
$activity = $DB->get_record('meetletacbmarketplace', ['id' => $cm->instance]);
$activity = $DB->get_record('meetletacbfree', ['id' => $cm->instance]);
if (!$activity) {
return;
}
$activity->userid = 0;
$activity->participants = self::strip_user_rules((string)($activity->participants ?? ''), null);
$activity->timemodified = time();
$DB->update_record('meetletacbmarketplace', $activity);
$DB->update_record('meetletacbfree', $activity);
}
/**
@@ -290,11 +290,11 @@ class provider implements
if ($context->contextlevel !== CONTEXT_MODULE) {
continue;
}
$cm = get_coursemodule_from_id('meetletacbmarketplace', $context->instanceid);
$cm = get_coursemodule_from_id('meetletacbfree', $context->instanceid);
if (!$cm) {
continue;
}
$activity = $DB->get_record('meetletacbmarketplace', ['id' => $cm->instance]);
$activity = $DB->get_record('meetletacbfree', ['id' => $cm->instance]);
if (!$activity) {
continue;
}
@@ -303,7 +303,7 @@ class provider implements
}
$activity->participants = self::strip_user_rules((string)($activity->participants ?? ''), $userid);
$activity->timemodified = time();
$DB->update_record('meetletacbmarketplace', $activity);
$DB->update_record('meetletacbfree', $activity);
}
}
@@ -323,11 +323,11 @@ class provider implements
if (!$userids) {
return;
}
$cm = get_coursemodule_from_id('meetletacbmarketplace', $context->instanceid);
$cm = get_coursemodule_from_id('meetletacbfree', $context->instanceid);
if (!$cm) {
return;
}
$activity = $DB->get_record('meetletacbmarketplace', ['id' => $cm->instance]);
$activity = $DB->get_record('meetletacbfree', ['id' => $cm->instance]);
if (!$activity) {
return;
}
@@ -338,7 +338,7 @@ class provider implements
$activity->participants = self::strip_user_rules((string)($activity->participants ?? ''), (int)$userid);
}
$activity->timemodified = time();
$DB->update_record('meetletacbmarketplace', $activity);
$DB->update_record('meetletacbfree', $activity);
}
/**
+2 -2
View File
@@ -4,12 +4,12 @@
/**
* HTTP client for MeetLet registration API.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\registration;
namespace mod_meetletacbfree\registration;
defined('MOODLE_INTERNAL') || die();
+6 -6
View File
@@ -4,12 +4,12 @@
/**
* Ed25519 + canonical JSON helpers (compatible with @meetlet/crypto).
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\registration;
namespace mod_meetletacbfree\registration;
defined('MOODLE_INTERNAL') || die();
@@ -85,7 +85,7 @@ PEM;
}
$raw = base64_decode(strtr($b64, '-_', '+/'), true);
if ($raw === false) {
throw new \moodle_exception('registration_crypto_error', 'meetletacbmarketplace');
throw new \moodle_exception('registration_crypto_error', 'meetletacbfree');
}
return $raw;
}
@@ -95,7 +95,7 @@ PEM;
*/
public static function generate_installation_keypair(): array {
if (!function_exists('sodium_crypto_sign_keypair')) {
throw new \moodle_exception('registration_sodium_required', 'meetletacbmarketplace');
throw new \moodle_exception('registration_sodium_required', 'meetletacbfree');
}
$kp = sodium_crypto_sign_keypair();
$secret = sodium_crypto_sign_secretkey($kp);
@@ -129,7 +129,7 @@ PEM;
$b64 = preg_replace('/\s+/', '', $b64);
$der = base64_decode($b64, true);
if ($der === false || strlen($der) < 32) {
throw new \moodle_exception('registration_crypto_error', 'meetletacbmarketplace');
throw new \moodle_exception('registration_crypto_error', 'meetletacbfree');
}
return substr($der, -32);
}
@@ -140,7 +140,7 @@ PEM;
$b64 = preg_replace('/\s+/', '', $b64);
$der = base64_decode($b64, true);
if ($der === false || strlen($der) < 48) {
throw new \moodle_exception('registration_crypto_error', 'meetletacbmarketplace');
throw new \moodle_exception('registration_crypto_error', 'meetletacbfree');
}
$seed = substr($der, -32);
$kp = sodium_crypto_sign_seed_keypair($seed);
+4 -4
View File
@@ -4,12 +4,12 @@
/**
* Map registration API / local error codes → product status and UX behaviour.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\registration;
namespace mod_meetletacbfree\registration;
defined('MOODLE_INTERNAL') || die();
@@ -107,8 +107,8 @@ class error_mapper {
}
public static function user_message(string $messagekey, string $fallback = ''): string {
if ($messagekey !== '' && get_string_manager()->string_exists($messagekey, 'meetletacbmarketplace')) {
return get_string($messagekey, 'meetletacbmarketplace');
if ($messagekey !== '' && get_string_manager()->string_exists($messagekey, 'meetletacbfree')) {
return get_string($messagekey, 'meetletacbfree');
}
return $fallback !== '' ? $fallback : $messagekey;
}
+19 -19
View File
@@ -7,12 +7,12 @@
* Hard-locks all plugin features until the administrator completes voluntary
* online activation. After activation, every Marketplace feature unlocks.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\registration;
namespace mod_meetletacbfree\registration;
defined('MOODLE_INTERNAL') || die();
@@ -28,7 +28,7 @@ class manager {
public const DEFAULT_API_URL = 'https://license.webatsign.com';
public static function api_base_url(): string {
$url = trim((string)get_config('meetletacbmarketplace', self::CONFIG_API_URL));
$url = trim((string)get_config('meetletacbfree', self::CONFIG_API_URL));
$url = rtrim($url, '/');
return $url !== '' ? $url : self::DEFAULT_API_URL;
}
@@ -53,16 +53,16 @@ class manager {
*/
public static function settings_tab_url(string $tab): \moodle_url {
return new \moodle_url('/admin/settings.php', [
'section' => 'modsettingmeetletacbmarketplace',
'section' => 'modsettingmeetletacbfree',
], $tab);
}
public static function settings_url(): \moodle_url {
return self::settings_tab_url('meetletacbmarketplace_registration');
return self::settings_tab_url('meetletacbfree_registration');
}
public static function privacy_tab_url(): \moodle_url {
return self::settings_tab_url('meetletacbmarketplace_privacy');
return self::settings_tab_url('meetletacbfree_privacy');
}
/**
@@ -82,7 +82,7 @@ class manager {
if (self::is_registered()) {
return;
}
throw new \moodle_exception('registration_required', 'meetletacbmarketplace', self::settings_url());
throw new \moodle_exception('registration_required', 'meetletacbfree', self::settings_url());
}
/** @deprecated Use require_registered() */
@@ -96,9 +96,9 @@ class manager {
}
$url = self::settings_url();
return \html_writer::div(
\html_writer::tag('strong', get_string('registration_gate_title', 'meetletacbmarketplace')) .
' ' . get_string('registration_gate_body', 'meetletacbmarketplace') . ' ' .
\html_writer::link($url, get_string('registration_gate_link', 'meetletacbmarketplace')),
\html_writer::tag('strong', get_string('registration_gate_title', 'meetletacbfree')) .
' ' . get_string('registration_gate_body', 'meetletacbfree') . ' ' .
\html_writer::link($url, get_string('registration_gate_link', 'meetletacbfree')),
'alert alert-warning meetlet-registration-gate mb-3'
);
}
@@ -113,7 +113,7 @@ class manager {
public static function activate(): array {
if (self::is_registered()) {
throw new \moodle_exception('registration_already_active', 'meetletacbmarketplace');
throw new \moodle_exception('registration_already_active', 'meetletacbfree');
}
$row = store::get_record();
$stale = $row && in_array($row->status ?? '', [
@@ -194,7 +194,7 @@ class manager {
'status' => $status,
'status_label' => self::status_label($active ? error_mapper::STATUS_ACTIVE : $status),
'product' => $active ? self::PRODUCT_SLUG : '',
'product_label' => $active ? get_string('registration_product_free', 'meetletacbmarketplace') : '',
'product_label' => $active ? get_string('registration_product_free', 'meetletacbfree') : '',
'can_deactivate' => self::can_deactivate($row),
'auth_expires_at' => self::parse_unix_timestamp($payload['expires_at'] ?? null),
'features' => is_array($payload['features'] ?? null) ? $payload['features'] : [],
@@ -263,8 +263,8 @@ class manager {
public static function status_label(string $status): string {
$key = 'registration_status_' . $status;
if (get_string_manager()->string_exists($key, 'meetletacbmarketplace')) {
return get_string($key, 'meetletacbmarketplace');
if (get_string_manager()->string_exists($key, 'meetletacbfree')) {
return get_string($key, 'meetletacbfree');
}
return $status;
}
@@ -301,7 +301,7 @@ class manager {
if ($expires !== null && time() >= $expires) {
self::invalidate_local([
'code' => 'LICENSE_EXPIRED',
'message' => get_string('registration_err_expired', 'meetletacbmarketplace'),
'message' => get_string('registration_err_expired', 'meetletacbfree'),
'at' => time(),
], error_mapper::STATUS_EXPIRED);
return true;
@@ -424,7 +424,7 @@ class manager {
'runtime' => 'php',
'runtime_version' => PHP_VERSION,
'metadata' => [
'plugin' => 'mod_meetletacbmarketplace',
'plugin' => 'mod_meetletacbfree',
'plugin_release' => self::plugin_release(),
],
];
@@ -555,7 +555,7 @@ class manager {
*/
protected static function status_error_message(string $status, ?array $lasterror): ?string {
if ($status === error_mapper::STATUS_EXPIRED) {
return get_string('registration_err_expired', 'meetletacbmarketplace');
return get_string('registration_err_expired', 'meetletacbfree');
}
return $lasterror['message'] ?? null;
}
@@ -603,14 +603,14 @@ class manager {
public static function plugin_release(): string {
global $CFG;
$plugin = new \stdClass();
$versionfile = $CFG->dirroot . '/mod/meetletacbmarketplace/version.php';
$versionfile = $CFG->dirroot . '/mod/meetletacbfree/version.php';
if (is_readable($versionfile)) {
include($versionfile);
}
if (!empty($plugin->release)) {
return (string)$plugin->release;
}
$ver = get_config('meetletacbmarketplace', 'version');
$ver = get_config('meetletacbfree', 'version');
return $ver !== false ? (string)$ver : '0';
}
}
@@ -4,12 +4,12 @@
/**
* Structured registration API / local client exception.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\registration;
namespace mod_meetletacbfree\registration;
defined('MOODLE_INTERNAL') || die();
@@ -40,7 +40,7 @@ class registration_exception extends \moodle_exception {
$this->requestid = $requestid !== null && $requestid !== '' ? $requestid : null;
parent::__construct(
'registration_api_error',
'meetletacbmarketplace',
'meetletacbfree',
'',
$this->apicode . ': ' . $this->apimessage
);
+4 -4
View File
@@ -4,20 +4,20 @@
/**
* Persist MeetLet installation identity + cached runtime authorization.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\registration;
namespace mod_meetletacbfree\registration;
defined('MOODLE_INTERNAL') || die();
/**
* Single-row registration store in meetlet_marketplace_license.
* Single-row registration store in meetletacbfree_license.
*/
class store {
public const TABLE = 'meetlet_marketplace_license';
public const TABLE = 'meetletacbfree_license';
/**
* @return \stdClass|null
+4 -4
View File
@@ -17,14 +17,14 @@
/**
* Scheduled task: optional MeetLet site registration heartbeat.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet <info@meetlet.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\task;
namespace mod_meetletacbfree\task;
use mod_meetletacbmarketplace\registration\manager;
use mod_meetletacbfree\registration\manager;
defined('MOODLE_INTERNAL') || die();
@@ -33,7 +33,7 @@ defined('MOODLE_INTERNAL') || die();
*/
class registration_heartbeat extends \core\task\scheduled_task {
public function get_name() {
return get_string('task_registration_heartbeat', 'meetletacbmarketplace');
return get_string('task_registration_heartbeat', 'meetletacbfree');
}
public function execute() {
+9 -9
View File
@@ -17,16 +17,16 @@
/**
* Scheduled task: sync Adobe Connect recordings into Moodle.
*
* @package mod_meetletacbmarketplace
* @package mod_meetletacbfree
* @copyright 2026 MeetLet <info@meetlet.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_meetletacbmarketplace\task;
namespace mod_meetletacbfree\task;
use mod_meetletacbmarketplace\api\service;
use mod_meetletacbmarketplace\local\instance;
use mod_meetletacbmarketplace\local\recordings;
use mod_meetletacbfree\api\service;
use mod_meetletacbfree\local\instance;
use mod_meetletacbfree\local\recordings;
defined('MOODLE_INTERNAL') || die();
@@ -35,17 +35,17 @@ defined('MOODLE_INTERNAL') || die();
*/
class sync_recordings extends \core\task\scheduled_task {
public function get_name() {
return get_string('tasksync', 'meetletacbmarketplace');
return get_string('tasksync', 'meetletacbfree');
}
public function execute() {
if (!\mod_meetletacbmarketplace\registration\manager::is_registered()) {
if (!\mod_meetletacbfree\registration\manager::is_registered()) {
mtrace('MeetLet registration: inactive — skip recording sync.');
return;
}
global $DB;
foreach ($DB->get_records('meetletacbmarketplace') as $activity) {
foreach ($DB->get_records('meetlet_marketplace_meetings', ['instanceid' => $activity->id]) as $map) {
foreach ($DB->get_records('meetletacbfree') as $activity) {
foreach ($DB->get_records('meetletacbfree_meetings', ['instanceid' => $activity->id]) as $map) {
try {
$inst = instance::get_from_instanceid((int)$activity->id, (int)$map->groupid);
$service = new service();