add mc server status part
This commit is contained in:
parent
05815e3414
commit
8081d0fdda
108
components/card/McServerStatusCard.vue
Normal file
108
components/card/McServerStatusCard.vue
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
defineProps<{
|
||||||
|
server: IMCServerStatus
|
||||||
|
}>()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
v-if="server.online"
|
||||||
|
class="p-4"
|
||||||
|
>
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<div class="flex items-center gap-4">
|
||||||
|
<!-- Server Logo -->
|
||||||
|
<img
|
||||||
|
:src="server.icon!"
|
||||||
|
alt=""
|
||||||
|
class="h-20 w-20 rounded-xl"
|
||||||
|
>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<p class="text-2xl font-bold">
|
||||||
|
{{ server.hostname?.toUpperCase() || "UNKNOWN HOST" }}
|
||||||
|
</p>
|
||||||
|
<p class="text-xl">
|
||||||
|
{{ server.port }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-col justify-between text-lg">
|
||||||
|
<p class="rounded-lg bg-gray-200 px-2">
|
||||||
|
{{ server.version || 'UNKNOWN VERSION' }}
|
||||||
|
</p>
|
||||||
|
<p class="rounded-lg bg-gray-200 px-2">
|
||||||
|
{{ server.players.online }} / {{ server.players.max }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-4 rounded-xl bg-blue-100 p-4">
|
||||||
|
<p
|
||||||
|
v-for="line in server.motd.clean"
|
||||||
|
:key="line"
|
||||||
|
>
|
||||||
|
{{ line }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-4">
|
||||||
|
<span class="text-xl">玩家列表</span>
|
||||||
|
<div
|
||||||
|
v-if="server.players.list?.length"
|
||||||
|
class="divide-y-2 divide-dashed"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-for="player in server.players.list"
|
||||||
|
:key="player.uuid"
|
||||||
|
class="mb-4 flex items-center gap-4 px-4 pt-4 last:mb-0"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
:src="`https://minotar.net/helm/${player.uuid}/32.png`"
|
||||||
|
alt=""
|
||||||
|
class="h-12 w-12"
|
||||||
|
>
|
||||||
|
<p class="text-xl">
|
||||||
|
{{ player.name }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-else
|
||||||
|
class="text-center"
|
||||||
|
>
|
||||||
|
没有在线玩家
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-4">
|
||||||
|
<div class="mt-4 flex justify-end gap-4">
|
||||||
|
<a
|
||||||
|
href="https://hmcl.huangyuhui.net/"
|
||||||
|
class="cursor-pointer rounded-lg bg-blue-400 px-4 py-1 text-lg text-white transition-all hover:bg-blue-500"
|
||||||
|
>
|
||||||
|
启动器
|
||||||
|
<font-awesome-icon :icon="['fas', 'arrow-up-right-from-square']" />
|
||||||
|
</a>
|
||||||
|
<a class="cursor-pointer rounded-lg bg-blue-400 px-4 py-1 text-lg text-white transition-all hover:bg-blue-500">
|
||||||
|
整合包
|
||||||
|
<font-awesome-icon :icon="['fas', 'arrow-up-right-from-square']" />
|
||||||
|
</a>
|
||||||
|
<a class="cursor-pointer rounded-lg bg-blue-400 px-4 py-1 text-lg text-white transition-all hover:bg-blue-500">
|
||||||
|
汉化补丁
|
||||||
|
<font-awesome-icon :icon="['fas', 'arrow-up-right-from-square']" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<p class="text-center text-xl p-4">
|
||||||
|
服务器离线
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
@ -1,5 +1,6 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { computed, onMounted, ref } from 'vue'
|
import { computed, onMounted, ref } from 'vue'
|
||||||
|
import McServerStatusCard from '~/components/card/McServerStatusCard.vue'
|
||||||
|
|
||||||
interface errObj {
|
interface errObj {
|
||||||
blog?: object
|
blog?: object
|
||||||
@ -9,6 +10,7 @@ interface errObj {
|
|||||||
const { $mitt } = useNuxtApp(),
|
const { $mitt } = useNuxtApp(),
|
||||||
recentPosts = ref<IPost[] | null>(null),
|
recentPosts = ref<IPost[] | null>(null),
|
||||||
recentActivities = ref<IActivity[] | null>(null),
|
recentActivities = ref<IActivity[] | null>(null),
|
||||||
|
mcServerStatus = ref<IMCServerStatus | null>(null),
|
||||||
isLoading = ref({
|
isLoading = ref({
|
||||||
blog: true,
|
blog: true,
|
||||||
git: true,
|
git: true,
|
||||||
@ -34,6 +36,10 @@ const { $mitt } = useNuxtApp(),
|
|||||||
'only-performed-by': true,
|
'only-performed-by': true,
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
|
getMCServerStatus = get<IMCServerStatus, unknown>('/frp-now.top:27344', {
|
||||||
|
baseURL: 'https://api.mcsrvstat.us/3',
|
||||||
|
timeout: 5000,
|
||||||
|
}),
|
||||||
|
|
||||||
hasPosts = computed(() => (recentPosts.value ?? []).length > 0),
|
hasPosts = computed(() => (recentPosts.value ?? []).length > 0),
|
||||||
hasActivities = computed(() => (recentActivities.value ?? []).length > 0),
|
hasActivities = computed(() => (recentActivities.value ?? []).length > 0),
|
||||||
@ -89,9 +95,18 @@ const { $mitt } = useNuxtApp(),
|
|||||||
finally {
|
finally {
|
||||||
isLoading.value.git = false
|
isLoading.value.git = false
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
reloadMCServerStatus = async () => {
|
||||||
|
try {
|
||||||
|
mcServerStatus.value = await getMCServerStatus()
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await Promise.allSettled([reloadPosts(), reloadActivities()])
|
await Promise.allSettled([reloadPosts(), reloadActivities(), reloadMCServerStatus()])
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
$mitt.emit('startLoading', false)
|
$mitt.emit('startLoading', false)
|
||||||
@ -156,6 +171,27 @@ onMounted(() => {
|
|||||||
</template>
|
</template>
|
||||||
</card-section-card>
|
</card-section-card>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section class="my-4 w-full sm:px-0">
|
||||||
|
<card-title
|
||||||
|
title="我的世界"
|
||||||
|
:icon="['fas', 'gamepad']"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<card-section-card
|
||||||
|
:empty="false"
|
||||||
|
:error="mcServerStatus === null"
|
||||||
|
:loading="mcServerStatus === null"
|
||||||
|
:err-msg="undefined"
|
||||||
|
@reload="reloadMCServerStatus"
|
||||||
|
>
|
||||||
|
<template #default>
|
||||||
|
<div class="w-full rounded-xl bg-white">
|
||||||
|
<mc-server-status-card :server="mcServerStatus!" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</card-section-card>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -16,6 +16,8 @@ import {
|
|||||||
faPen,
|
faPen,
|
||||||
faXmark,
|
faXmark,
|
||||||
faBookMedical,
|
faBookMedical,
|
||||||
|
faGamepad,
|
||||||
|
faArrowUpRightFromSquare,
|
||||||
} from '@fortawesome/free-solid-svg-icons'
|
} from '@fortawesome/free-solid-svg-icons'
|
||||||
import { faClock, faFolder } from '@fortawesome/free-regular-svg-icons'
|
import { faClock, faFolder } from '@fortawesome/free-regular-svg-icons'
|
||||||
import { faGithubAlt, faQq, faSteamSymbol, faWeibo } from '@fortawesome/free-brands-svg-icons'
|
import { faGithubAlt, faQq, faSteamSymbol, faWeibo } from '@fortawesome/free-brands-svg-icons'
|
||||||
@ -28,6 +30,7 @@ export default defineNuxtPlugin((nuxtApp) => {
|
|||||||
library.add(
|
library.add(
|
||||||
faClock, faXmark, faBlog, faGauge, faCodeBranch, faCloud, faWeibo, faQq, faGithubAlt, faSteamSymbol, faChevronRight,
|
faClock, faXmark, faBlog, faGauge, faCodeBranch, faCloud, faWeibo, faQq, faGithubAlt, faSteamSymbol, faChevronRight,
|
||||||
faCodeCommit, faCode, faHouse, faPen, faBrush, faChessRook, faBars, faChevronDown, faFolder, faLink, faBookMedical,
|
faCodeCommit, faCode, faHouse, faPen, faBrush, faChessRook, faBars, faChevronDown, faFolder, faLink, faBookMedical,
|
||||||
|
faGamepad, faArrowUpRightFromSquare,
|
||||||
)
|
)
|
||||||
|
|
||||||
nuxtApp.vueApp.component('font-awesome-icon', FontAwesomeIcon)
|
nuxtApp.vueApp.component('font-awesome-icon', FontAwesomeIcon)
|
||||||
|
66
types/mc.ts
Normal file
66
types/mc.ts
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
declare global {
|
||||||
|
interface IMCServerStatus {
|
||||||
|
online: boolean
|
||||||
|
ip: string
|
||||||
|
port: number
|
||||||
|
hostname?: string // Only included when a hostname is detected
|
||||||
|
debug: { // See section below for information about the values
|
||||||
|
ping: boolean
|
||||||
|
query: boolean
|
||||||
|
srv: boolean
|
||||||
|
querymismatch: boolean
|
||||||
|
ipinsrv: boolean
|
||||||
|
cnameinsrv: boolean
|
||||||
|
animatedmotd: boolean
|
||||||
|
cachehit: boolean
|
||||||
|
cachetime: number
|
||||||
|
cacheexpire: number
|
||||||
|
apiversion: number
|
||||||
|
}
|
||||||
|
version?: string // Could include multiple versions or additional text
|
||||||
|
protocol?: { // Only included when ping is used
|
||||||
|
version: number
|
||||||
|
name?: string // Only included if a version name is found
|
||||||
|
}
|
||||||
|
icon?: string // Only included when an icon is detected
|
||||||
|
software?: string // Only included when software is detected
|
||||||
|
map: {
|
||||||
|
raw: string
|
||||||
|
clean: string
|
||||||
|
html: string
|
||||||
|
}
|
||||||
|
gamemode?: string // Only included for Bedrock servers
|
||||||
|
serverid?: string // Only included for Bedrock servers
|
||||||
|
eula_blocked?: boolean // Only included for Java servers
|
||||||
|
motd: {
|
||||||
|
raw: string[]
|
||||||
|
clean: string[]
|
||||||
|
html: string[]
|
||||||
|
}
|
||||||
|
players: {
|
||||||
|
online: number
|
||||||
|
max: number
|
||||||
|
list?: // Only included when there are players
|
||||||
|
{
|
||||||
|
name: string
|
||||||
|
uuid: string
|
||||||
|
}[]
|
||||||
|
|
||||||
|
}
|
||||||
|
plugins?: // Only included when plugins are detected
|
||||||
|
{
|
||||||
|
name: string
|
||||||
|
version: string
|
||||||
|
}[]
|
||||||
|
mods?: // Only included when mods are detected
|
||||||
|
{
|
||||||
|
name: string
|
||||||
|
version: string
|
||||||
|
}[]
|
||||||
|
info?: { // Only included when detecting that the player samples are used for information
|
||||||
|
raw: string[]
|
||||||
|
clean: string[]
|
||||||
|
html: string[]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user