Rename marketplace plugin to meetletacbfree (mdl_modules.name limit + CI table prefixes)
This commit is contained in:
@@ -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',
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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'
|
||||
) .
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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 {
|
||||
|
||||
Vendored
+19
-19
@@ -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
@@ -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
@@ -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 {
|
||||
|
||||
Vendored
+31
-31
@@ -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
@@ -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
@@ -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
@@ -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'),
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)) .
|
||||
|
||||
@@ -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
@@ -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']) .
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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,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;
|
||||
}
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user