From 8c622b33113a7a3bc44ac54759495f3102e1e528 Mon Sep 17 00:00:00 2001 From: bia-pain-bache Date: Thu, 21 Nov 2024 17:44:11 +0330 Subject: [PATCH] Revised My IP, build flow. --- .github/ISSUE_TEMPLATE/bug_report.yml | 6 +++ .github/ISSUE_TEMPLATE/feature_request.yml | 16 ------ .github/workflows/build.yml | 21 ++++++-- docs/assets/images/My-IP.jpg | Bin 27000 -> 32854 bytes src/helpers/helpers.js | 16 ++++++ src/helpers/init.js | 2 +- src/pages/home.js | 60 ++++++++++++++------- src/worker.js | 5 +- 8 files changed, 83 insertions(+), 43 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 0e75b0160..58bfeaa85 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -38,5 +38,11 @@ body: label: Relevant log output | لاگ برنامه یا پنل description: Refer to the program menu and copy the log and send it to us. render: shell + validations: + required: true + - type: textarea + id: panel-version + attributes: + label: Panel version | نسخه‌ی پنل validations: required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml deleted file mode 100644 index 310387a5c..000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Feature Request | درخواست امکانات جدید -description: Request a new feature -labels: ['enhancement'] - -body: - - type: markdown - attributes: - value: | - Here is a template you can use to share your idea. - اینجا می‌توانید ایده خود به اشتراک بگذارید. - - type: textarea - attributes: - label: Feature description | توضیحات ویژگی - description: Please provide a clear and concise description of what you want to happen and what problem will this solve | لطفاً توضیحات روشن و کوتاهی از آنچه که می‌خواهید رخ دهد و مشکلی که پیش می‌آید را حل کنید، ارائه دهید. - validations: - required: true \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 329a751ce..a6af62246 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,9 +1,8 @@ -name: Build and Deploy Worker +name: Build and Deploy Worker on Release -on: - push: - branches: - - dev +on: + release: + types: [published] jobs: build: @@ -12,6 +11,8 @@ jobs: steps: - name: Check out the code uses: actions/checkout@v4 + with: + ref: dev - name: Set up Node.js uses: actions/setup-node@v4 @@ -35,3 +36,13 @@ jobs: git push env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload built worker to release assets + uses: actions/upload-release-asset@v1 + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: ./_worker.js + asset_name: worker.js + asset_content_type: application/javascript + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/docs/assets/images/My-IP.jpg b/docs/assets/images/My-IP.jpg index 757f2c597a30ffc396fcfd080f3c67ab84233154..d207d3eae314ab1aaf07014e55ad76834375da0d 100644 GIT binary patch literal 32854 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 m+Y=Nt50Q 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 diff --git a/src/helpers/helpers.js b/src/helpers/helpers.js index 51811de04..e2842c048 100644 --- a/src/helpers/helpers.js +++ b/src/helpers/helpers.js @@ -65,4 +65,20 @@ export async function fallback(request) { url.protocol = 'https:'; request = new Request(url, request); return await fetch(request); +} + +export async function getMyIP(request) { + const ip = await request.text(); + try { + const response = await fetch(`http://ip-api.com/json/${ip}?nocache=${Date.now()}`); + const geoLocation = await response.json(); + return new Response(JSON.stringify(geoLocation), { + status: 200, + headers: { + 'Content-Type': 'text/plain;charset=utf-8' + } + }); + } catch (error) { + console.error('Error fetching IP address:', error); + } } \ No newline at end of file diff --git a/src/helpers/init.js b/src/helpers/init.js index 0b8b8d0fa..9fa775c9c 100644 --- a/src/helpers/init.js +++ b/src/helpers/init.js @@ -11,7 +11,7 @@ function initParams(request, env) { trojanPassword = env.TROJAN_PASS || 'bpb-trojan'; defaultHttpPorts = ['80', '8080', '2052', '2082', '2086', '2095', '8880']; defaultHttpsPorts = ['443', '8443', '2053', '2083', '2087', '2096']; - panelVersion = '2.7.3'; + panelVersion = '2.7.4'; hostName = request.headers.get('Host'); const url = new URL(request.url); const searchParams = new URLSearchParams(url.search); diff --git a/src/pages/home.js b/src/pages/home.js index 09df51619..936157844 100644 --- a/src/pages/home.js +++ b/src/pages/home.js @@ -244,6 +244,9 @@ export async function renderHomePage (request, env, proxySettings, isPassSet) { box-shadow: 0 8px 15px rgba(0, 0, 0, 0.3); transform: translateY(-2px); } + .header-container button:hover { + transform: scale(1.1); + } button.button:hover { color: white; } .button:active, table button:active { transform: translateY(1px); box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); } @@ -372,6 +375,7 @@ export async function renderHomePage (request, env, proxySettings, isPassSet) { #ips th { background-color: var(--hr-text-color); color: var(--background-color); width: unset; } #ips td { background-color: unset; } #ips td:first-child { background-color: var(--table-active-color); } + .header-container { display: flex; align-items: center; justify-content: center; } @media only screen and (min-width: 768px) { .form-container { max-width: 70%; } .form-control { @@ -672,7 +676,7 @@ export async function renderHomePage (request, env, proxySettings, isPassSet) {
-

NORMAL SUB 🔗

+

🔗 NORMAL SUB

@@ -698,7 +702,7 @@ export async function renderHomePage (request, env, proxySettings, isPassSet) {
-

FULL NORMAL SUB 🔗

+

🔗 FULL NORMAL SUB

@@ -734,7 +738,7 @@ export async function renderHomePage (request, env, proxySettings, isPassSet) {
-

FRAGMENT SUB ⛓️

+

🔗 FRAGMENT SUB

@@ -761,7 +765,7 @@ export async function renderHomePage (request, env, proxySettings, isPassSet) {
-

WARP SUB 🔗

+

🔗 WARP SUB

@@ -797,7 +801,7 @@ export async function renderHomePage (request, env, proxySettings, isPassSet) {
-

WARP PRO SUB 🔗

+

🔗 WARP PRO SUB

@@ -852,7 +856,12 @@ export async function renderHomePage (request, env, proxySettings, isPassSet) {
-

MY IP 💡

+
+

💡 MY IP

+ +
@@ -860,18 +869,21 @@ export async function renderHomePage (request, env, proxySettings, isPassSet) { + + +
IP Country CityISP
Cloudflare CDN
Others
@@ -1012,26 +1024,34 @@ export async function renderHomePage (request, env, proxySettings, isPassSet) { }); const fetchIPInfo = async () => { - const updateUI = (ip = '-', country = '-', country_code = '-', city = '-', cfIP) => { - const flag = country_code !== '-' ? String.fromCodePoint(...[...country_code].map(c => 0x1F1E6 + c.charCodeAt(0) - 65)) : ''; + const updateUI = (ip = '-', country = '-', countryCode = '-', city = '-', isp = '-', cfIP) => { + const flag = countryCode !== '-' ? String.fromCodePoint(...[...countryCode].map(c => 0x1F1E6 + c.charCodeAt(0) - 65)) : ''; document.getElementById(cfIP ? 'cf-ip' : 'ip').textContent = ip; document.getElementById(cfIP ? 'cf-country' : 'country').textContent = country + ' ' + flag; document.getElementById(cfIP ? 'cf-city' : 'city').textContent = city; + document.getElementById(cfIP ? 'cf-isp' : 'isp').textContent = isp; }; - const fetchIPApi = async (cfIP) => { - try { - const response = await fetch('https://ipwho.is/' + cfIP + '?nocache=' + Date.now(), { cache: "no-store" }); - const { ip, country, country_code, city } = await response.json(); - updateUI(ip, country, country_code, city, cfIP); - } catch (error) { - console.error('Error fetching IP address:', error); - updateUI(); - } + try { + const ipResponse = await fetch('https://ipwho.is/' + '?nocache=' + Date.now(), { cache: "no-store" }); + const ipResponseObj = await ipResponse.json(); + const geoResponse = await fetch('/my-ip', { + method: 'POST', + body: ipResponseObj.ip + }); + const ipGeoLocation = await geoResponse.json(); + updateUI(ipResponseObj.ip, ipGeoLocation.country, ipGeoLocation.countryCode, ipGeoLocation.city, ipGeoLocation.isp); + const cfIPresponse = await fetch('https://ipv4.icanhazip.com/?nocache=' + Date.now(), { cache: "no-store" }); + const cfIP = await cfIPresponse.text(); + const cfGeoResponse = await fetch('/my-ip', { + method: 'POST', + body: cfIP.trim() + }); + const cfIPGeoLocation = await cfGeoResponse.json(); + updateUI(cfIP, cfIPGeoLocation.country, cfIPGeoLocation.countryCode, cfIPGeoLocation.city, cfIPGeoLocation.isp, true); + } catch (error) { + console.error('Error fetching IP address:', error); } - - await fetchIPApi(''); - await fetchIPApi('${request.headers.get('cf-connecting-ip') || '-'}'); } const getWarpConfigs = async () => { diff --git a/src/worker.js b/src/worker.js index 570097126..e7afe5582 100644 --- a/src/worker.js +++ b/src/worker.js @@ -9,7 +9,7 @@ import { getSingBoxCustomConfig, getSingBoxWarpConfig } from './cores-configs/si import { getClashNormalConfig, getClashWarpConfig } from './cores-configs/clash'; import { getNormalConfigs } from './cores-configs/normalConfigs'; import { initializeParams, userID, client, pathName } from './helpers/init'; -import { fallback, handlePanel } from './helpers/helpers'; +import { fallback, getMyIP, handlePanel } from './helpers/helpers'; export default { async fetch(request, env) { @@ -48,6 +48,9 @@ export default { case '/panel/password': return await resetPassword(request, env); + + case '/my-ip': + return await getMyIP(request); default: return await fallback(request);