From a74975a149f001283f5d9452c66f4817f067d7fd Mon Sep 17 00:00:00 2001 From: ShanRenYi - CTB <88585893+SRY-CTB@users.noreply.github.com> Date: Sun, 18 Aug 2024 20:46:21 +0800 Subject: [PATCH 1/2] Create README.md --- plugins/refresh-huawei-cdn/README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 plugins/refresh-huawei-cdn/README.md diff --git a/plugins/refresh-huawei-cdn/README.md b/plugins/refresh-huawei-cdn/README.md new file mode 100644 index 0000000..471f9e4 --- /dev/null +++ b/plugins/refresh-huawei-cdn/README.md @@ -0,0 +1,17 @@ +# refresh-huawei-cdn + +这个插件可以在用户更新其角色信息时,自动发送华为云CDN刷新缓存的API。 + +## 配置 + +你需要在 .env 中配置这些参数 + +- `HUAWEI_CLOUD_USERNAME` - IAM用户名 +- `HUAWEI_CLOUD_PASSWORD` - IAM用户密码 +- `HUAWEI_CLOUD_DOMAIN_NAME` - IAM用户所属账号名 +- `HUAWEI_CLOUD_PROJECT_NAME` - 项目。在 “我的凭证” - “API凭证”页面可以看到,任选。 +- `HUAWEI_CLOUD_IAM_BASE_URL` - 终端节点地址。在 https://console-intl.huaweicloud.com/apiexplorer/#/endpoint/IAM 查看您所选择的项目对应的节点地址,项目和区域同名。 +- `HUAWEI_CLOUD_CDN_BASE_URL` - 网站地址,例如 https://example.com,一定**不要**在末尾加斜杠 + +## 注意 +请先判断当前账号是华为账号还是华为云账号,可以根据https://support.huaweicloud.com/account_faq/faq_id_0009.html判断。华为账号获取Token需要创建IAM账户,授予该用户必要的权限,可以查看https://support.huaweicloud.com/api-iam/iam_30_0001.html。华为云账号获取Token无特殊要求。 From 8b22352810f67392348b695b7999ba2e0d2bf939 Mon Sep 17 00:00:00 2001 From: ShanRenYi - CTB <88585893+SRY-CTB@users.noreply.github.com> Date: Sun, 18 Aug 2024 20:46:41 +0800 Subject: [PATCH 2/2] Add files via upload --- plugins/refresh-huawei-cdn/bootstrap.php | 111 +++++++++++++++++++++++ plugins/refresh-huawei-cdn/package.json | 17 ++++ 2 files changed, 128 insertions(+) create mode 100644 plugins/refresh-huawei-cdn/bootstrap.php create mode 100644 plugins/refresh-huawei-cdn/package.json diff --git a/plugins/refresh-huawei-cdn/bootstrap.php b/plugins/refresh-huawei-cdn/bootstrap.php new file mode 100644 index 0000000..95ab080 --- /dev/null +++ b/plugins/refresh-huawei-cdn/bootstrap.php @@ -0,0 +1,111 @@ +listen(App\Events\PlayerProfileUpdated::class, function ($event) { + // 获取配置 + $baseUrl = env('HUAWEI_CLOUD_CDN_BASE_URL'); + $iamBaseUrl = env('HUAWEI_CLOUD_IAM_BASE_URL'); + $enterpriseProjectId = env('HUAWEI_CLOUD_ENTERPRISE_PROJECT_ID', '0'); + $username = env('HUAWEI_CLOUD_USERNAME'); + $password = env('HUAWEI_CLOUD_PASSWORD'); + $domainName = env('HUAWEI_CLOUD_DOMAIN_NAME'); + $projectName = env('HUAWEI_CLOUD_PROJECT_NAME'); + + // 从缓存中获取Token,如果不存在则获取新的Token + $authToken = Cache::remember('huawei_cloud_auth_token', 23 * 60, function () use ($iamBaseUrl, $username, $password, $domainName, $projectName) { + $response = Http::post($iamBaseUrl . '/v3/auth/tokens', [ + 'auth' => [ + 'identity' => [ + 'methods' => ['password'], + 'password' => [ + 'user' => [ + 'domain' => ['name' => $domainName], + 'name' => $username, + 'password' => $password, + ], + ], + ], + 'scope' => [ + 'project' => ['name' => $projectName], + ], + ], + ]); + + if ($response->successful()) { + return $response->header('X-Subject-Token'); + } else { + Log::error('Failed to obtain Huawei Cloud Token: ' . $response->body()); + return null; + } + }); + + if (!$authToken) { + return; + } + + // 检测插件 + $usm = plugin('usm-api'); + $legacy = plugin('legacy-api'); + $yggdrasil = plugin('yggdrasil-api'); + + $name = $event->player->name; + $urls = [ + $baseUrl.'/'.$name.'.json', + $baseUrl.'/csl/'.$name.'.json', + ]; + + if (isset($usm) && $usm->isEnabled()) { + $urls[] = $baseUrl.'/usm/'.$name.'.json'; + } + + if (isset($legacy) && $legacy->isEnabled()) { + array_push( + $urls, + $baseUrl.'/skin/'.$name.'.png', + $baseUrl.'/cape/'.$name.'.png' + ); + } + + if (isset($yggdrasil) && $yggdrasil->isEnabled()) { + $uuid = DB::table('uuid')->where('name', $name)->value('uuid'); + array_push( + $urls, + $baseUrl.'/api/yggdrasil/sessionserver/session/minecraft/profile/'.$uuid, + $baseUrl.'/api/yggdrasil/sessionserver/session/minecraft/profile/'.$uuid.'?unsigned=false', + $baseUrl.'/api/yggdrasil/sessionserver/session/minecraft/profile/'.$uuid.'?unsigned=true' + ); + } + + $requestBody = [ + 'refresh_task' => [ + 'type' => 'file', + 'urls' => $urls, + ], + ]; + + // 请求URL + $requestUrl = 'https://cdn.myhuaweicloud.com/v1.0/cdn/content/refresh-tasks'; + + if ($enterpriseProjectId !== '0') { + $requestUrl .= '?enterprise_project_id=' . $enterpriseProjectId; + } + + $response = Http::withHeaders([ + 'X-Auth-Token' => $authToken, + 'Content-Type' => 'application/json', + ])->post($requestUrl, $requestBody); + + if ($response->successful()) { + $refreshTaskId = $response->json('refresh_task'); + + } else { + // 处理错误 + Log::error('Failed to refresh Huawei Cloud CDN cache: ' . $response->body()); + } + }); +}; diff --git a/plugins/refresh-huawei-cdn/package.json b/plugins/refresh-huawei-cdn/package.json new file mode 100644 index 0000000..7af042f --- /dev/null +++ b/plugins/refresh-huawei-cdn/package.json @@ -0,0 +1,17 @@ +{ + "name": "refresh-huawei-cdn", + "version": "1.0.0", + "title": "刷新华为云 CDN", + "description": "当角色信息被更新时,自动刷新华为云 CDN 缓存", + "author": "SRY-CTB", + "namespace": "SRY-CTB\\RefreshHuaweiCdn", + "require": { + "blessing-skin-server": "^5|^6" + }, + "enchants": { + "icon": { + "fa": "fire", + "bg": "lime" + } + } +}