where the time is
{mouted && ( -- {timeString} -
+{timeString}
)}RCtu#2`Owror%)+4#pmP4!)%a&o9nUh+CIsWna(RhF=IYZQ@xACk8FvU zW=4f+9i|IR!nC+lnASTlKc>Yc+u*!pOlwQF(Rl?htu5ImEW+oYAa7b+!cU!82-D({ zZMNNjX>qCgWn#LR!q@>!)o-iqM(kJHHt$;mJ80W(D;i?{4;gnDi;;NPw$oM|J7W9X zRsz$^sKkDO>0)le{vcMB{L* 0(q! zLbk>>6_Pkx6Ys0~pkvSlO`WIups)6_TX@rU)rSPzt;9#7gI^CPM)H}OK^j{EeImW) zdI_PUsM#Muel1eJ#h z#`eT2j+BR>5 w06q29FuI^KZ@TMxm{V zg2b(A8LxzJ@K$re~n0tsAkHmX>ENOe0Ar*55)}c6G2Y*4=qpcJ-atgIE`%+ttv= zi}W;VDjOMl5$ir_HuT>II>}wcI -~opt|p;-N;3NMEpJ!)zK+cUy){BkE-vPOOX8i27i3!3f@T(Xzg_k;Gab8l=AZ z(gmaROHey&ME#AUiM6wAfNc!1u3DoUi0J~y+BC``wsFKdo<^DBea92)c(UQP3C@dX z 3<-3UCNG~-V$z@n!kF^b+|EBBPU!i xE-^HuL0$gEnx6{)btQS2{u1VOFgw=fMEtf;{u^_y!*dT8$%&5@$w}yv_CFb@L>vGB delta 7763 zcmYk=2Y6If8piRPOaciV0@6z$5PFwh1f-Wx1f=&Sy%*6D5U{LL78&fWtczHXRWu@q z(m@bAA__tXC4?p&5%vF)cb{kPlQZX=-#z! rh`V_g@ z^}KieXv>2&u^sX$@?uSGha^8Bsbhj%^yhU@*b~5sfPI21Ji$YtyE5lX{+h)u3DT-t7xM$}giOV^~ zdG9L8uH9~a0gK_i?$91gQ+V0!N)z8t(L7y=Oy(5ftKO9et h1Zm?4`9*b#rRZ0d{ggVYvjrd4hm{+!(KDavZDdxBYbuL>C;sYG4 zNzQGnN&KxXkF6H=oh`4eHrAD*iO*-NL%fDrNTkjmHrC}$6+JL)1#I^cSF>s4`~~$W z)ou5 SDQ9e@ zY|XF?TWMQ!?5wSf?LI6sTaY#XiN+S-IX5h8Yl)q=m9w?NF4&T6TGtnCy6DO)}z~)TAv*cQs&s&Qfm$Mq0F-_2yuN)e_x93t+vOhHM)Kj z-7`Joi>TGEKjk8Up7F)D0X9A3PuK<$7w{*~leR&aI;rg`+hC2qi>KykP!}FT8Hwrf zdj``$hf+q_migde*dpKe Qm59=i z_!^o8%wxr%>Spx zIbcCI+=B5JJWMHM+X|>Nb15Zk+kNaKSV`Ls+oM<|+fJKqcV*iyO!+5xj8et87t}@O zQL5VZ`QZ6jb=!WoTY%ND9k4x))wF$$X^k$V)Uq9PyG2;Ij`0wv=~_&wYx~Le1a`0O zu AN(xV*mlCU1Z!eTw=Kn* z+D_V*Va;r(FwN?6N^{#8O!+7HCwQMR6VxJHL1|&T=!2ibTH1cYG+Qevt!$TV5$t~3 z727JTwe70yd8}>Ncnwq!U!b(J-EhMfvG%r`wwJJuwp%{-Wvr9!w(S+Hv+a(LeHH6s z3;$_+4NNiqW&0P_)uw6Dh+n64vqfR*^lD0XTgdJHjrFj_*xtZ;+G4XT9Q+6DWz6P= zYp~w7?6x Chh?3Lx4)Flpe{H!yjpSX5K0LJL zal>`QDP+RI)Oj%`CwPxC4jV#U!0px(ucd>-s1t1eC4LrD+AWCj7rakdg(>S6DPjD8 zH#(uxu1r(CA#(g>zM+3ecotGtEk&( uI+Q;{@CNxO)!mnD`k+aX$)7=MYd6f7@N~jww*H6*1`wx!1`hfsas;| z%uY&sOgXEy+wIbRO!=veZ8vc OlhYl#$RxN5{HGAC;GVISHyR?Pf7{>F GXd8*K+Jf&WyRp})$GhG4#9D@WxF*DKr*)AZDEf|}r)HuX z9wZ)2(L*!I_9O8nVm&mIZHI_2+osrl!cw`g9-66`rur~tJ*I8C+x@JSrj@BDX@>C^ zVws+#nYJUuZxC;wo@F~qe4bcO&}?emre7(ii1lR5rPhUyQPPR^WISp+PP~_EY|{OI z%$Pt4{4t_urSxZy=& zU0C*BayUWMr*S12cmw^F}gyGpFvv{m>2CF3>lGzV{^ zeg)I?U#Fb0y=uFG&BeA;zvg3a5}zjCLH)Yh-6B@Tl&z*#XMU%2;@0h?)_RKO`oV3A z7Q-&;HE#F^v3jkfvDS8nSiP3LZTpk>FXBDa?^3JNe^K-$R;Dk{vb!&sa?5+RD0YNH zppwgaP(6$WwOW;2-gm wSvgj=!4~UwN;n_dvbmj1zx4DrJ1?4Pl2ABE zHO7IOYB2cN7LRFWl$bVR>R=8`i%W@VliTIQw76uO-7XiVwI$o)cDXUFE!k&xjrq?5 zYH ?o$}x5HKd`_;C~$0lIMY`bj*vE%xNri1qw z3xR32y|#O>6SgmGg)z;HQtUoVohgD{C03UF((Q_3%9u)42W-VKWlUN4D`Rm`qe}z7 z#&p6G*u$(=C82L^C9%1-?`@@gY&z`@+DiM_lh`3!86PV ET#meg{*;8z%*M*U^<5^89SlRe`T;U#)_b3K^aWn ziqx dx`>k1Ew`(M=^{#2w{5j$#7azeY;`c5Pq{^pGjD_Tb$L||P$JRu zEWDQ&bw-IK%2v;&2GO?q#5z{_Ar$HMCSNCGysM#iDJ8_(8WHQXN(tF)jfpiLrG)I% znxH1c8jmtUysas*Zj7G(oVI4fx-okCb7xsNXwDnm8KHix>xB0a>mo`C`E4zTbrGe6 z1Y1jD-5F(sLbg`K>a;RKVcY%0y0D)9qPEt=r?i}e#f@!<&k-vn=m)$y)0S8lR!S&s zYe%evsFaXMO%=4~MV(PbDC>3|i1pE 4rUs)fwHd+CJd} zHce$6TTf!$Ce4QaNuZ1LBG!d9pnA66HVsHW{?+cmEDHx3k$&h4`?#S-q#yONzQpRa zMx-C`>UBS2B}t7)zssqD{=DdkmFai6YydAhR)cKiV+RtegBoO;Snj_rGRUY=wxgkJ zFtHBSh&uS-AvTRjzoXTep*D@Et8JJ~1L|QLPOMIAK)o=kU__W#^;+25IFeWkM5EMC zT&iFcFFIHw>SG&CtYc+;ZDWYlX^pZUrVc)2(;x@h#uDp%VU2Q#4<1LX6Uv6##=D_L zKFl`3?PSAk6Wva;F~T;I$X*M3R zO()h!H1e^w8N@oDY@BVT+i5n&+h#>^|J6`9!8n^(7uFO_w9T<;HYV8~wrS*(ZF6lJ z , @@ -20,12 +20,12 @@ const PopoverContent = React.forwardRef< sideOffset={sideOffset} className={cn( "z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", - className + className, )} {...props} /> -)) -PopoverContent.displayName = PopoverPrimitive.Content.displayName +)); +PopoverContent.displayName = PopoverPrimitive.Content.displayName; -export { Popover, PopoverTrigger, PopoverContent } +export { Popover, PopoverTrigger, PopoverContent }; diff --git a/lib/prefetch.tsx b/lib/prefetch.tsx deleted file mode 100644 index 911edbb..0000000 --- a/lib/prefetch.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { NezhaAPI, ServerApi } from "@/app/types/nezha-api"; -import { MakeOptional } from "@/app/types/utils"; -import { error } from "console"; - -export async function GetNezhaData() { - if (!process.env.NezhaBaseUrl) { - error("NezhaBaseUrl is not set"); - return; - } - // Remove trailing slash - var nezhaBaseUrl = process.env.NezhaBaseUrl; - - if (process.env.NezhaBaseUrl[process.env.NezhaBaseUrl.length - 1] === "/") { - nezhaBaseUrl = process.env.NezhaBaseUrl.slice(0, -1); - } - try { - const response = await fetch(nezhaBaseUrl + "/api/v1/server/details", { - headers: { - Authorization: process.env.NezhaAuth as string, - }, - next: { - revalidate: 1, - }, - }); - const nezhaData = (await response.json()).result as NezhaAPI[]; - const data: ServerApi = { - live_servers: 0, - offline_servers: 0, - total_bandwidth: 0, - result: [], - }; - const timestamp = Date.now() / 1000; - data.result = nezhaData.map( - (element: MakeOptional ) => { - if (timestamp - element.last_active > 300) { - data.offline_servers += 1; - } else { - data.live_servers += 1; - } - data.total_bandwidth += element.status.NetOutTransfer; - - delete element.ipv4; - delete element.ipv6; - delete element.valid_ip; - - return element; - }, - ); - - return data; - } catch (error) { - return error; - } -} \ No newline at end of file diff --git a/lib/serverFetch.tsx b/lib/serverFetch.tsx new file mode 100644 index 0000000..6058678 --- /dev/null +++ b/lib/serverFetch.tsx @@ -0,0 +1,58 @@ +"use server"; + +import { NezhaAPI, ServerApi } from "@/app/types/nezha-api"; +import { MakeOptional } from "@/app/types/utils"; +import { error } from "console"; + +export async function GetNezhaData() { + if (!process.env.NezhaBaseUrl) { + error("NezhaBaseUrl is not set"); + return; + } + // Remove trailing slash + var nezhaBaseUrl = process.env.NezhaBaseUrl; + + if (process.env.NezhaBaseUrl[process.env.NezhaBaseUrl.length - 1] === "/") { + nezhaBaseUrl = process.env.NezhaBaseUrl.slice(0, -1); + } + try { + const response = await fetch(nezhaBaseUrl + "/api/v1/server/details", { + headers: { + Authorization: process.env.NezhaAuth as string, + }, + next: { + revalidate: 1, + }, + }); + const nezhaData = (await response.json()).result as NezhaAPI[]; + const data: ServerApi = { + live_servers: 0, + offline_servers: 0, + total_bandwidth: 0, + result: [], + }; + const timestamp = Date.now() / 1000; + data.result = nezhaData.map( + (element: MakeOptional ) => { + if (timestamp - element.last_active > 300) { + data.offline_servers += 1; + element.online_status = false; + } else { + data.live_servers += 1; + element.online_status = true; + } + data.total_bandwidth += element.status.NetOutTransfer; + + delete element.ipv4; + delete element.ipv6; + delete element.valid_ip; + + return element; + }, + ); + + return data; + } catch (error) { + return error; + } +} diff --git a/lib/utils.ts b/lib/utils.ts index e3a7514..2512031 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -6,16 +6,16 @@ export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } -export function formatNezhaInfo(timestamp: number, serverInfo: NezhaAPISafe) { - return { - ...serverInfo, - cpu: serverInfo.status.CPU, - up: serverInfo.status.NetOutSpeed / 1024 / 1024, - down: serverInfo.status.NetInSpeed / 1024 / 1024, - online: timestamp - serverInfo.last_active > 300 ? "offline" : "online", - mem: (serverInfo.status.MemUsed / serverInfo.host.MemTotal) * 100, - stg: (serverInfo.status.DiskUsed / serverInfo.host.DiskTotal) * 100, - } +export function formatNezhaInfo(serverInfo: NezhaAPISafe) { + return { + ...serverInfo, + cpu: serverInfo.status.CPU, + up: serverInfo.status.NetOutSpeed / 1024 / 1024, + down: serverInfo.status.NetInSpeed / 1024 / 1024, + online: serverInfo.online_status, + mem: (serverInfo.status.MemUsed / serverInfo.host.MemTotal) * 100, + stg: (serverInfo.status.DiskUsed / serverInfo.host.DiskTotal) * 100, + }; } export function formatBytes(bytes: number, decimals: number = 2) {