"use client"; import { useState } from "react"; import { Separator } from "@/components/ui/separator"; import { Button } from "@/components/ui/button"; import { Badge } from "./ui/badge"; import ServersList from "@/lib/list"; import { CircleUser, Network, Sun, Check, XIcon, Info } from "lucide-react"; import Stat from "./Stat"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; import toast from "react-hot-toast"; import { allTags, allCategories } from "@/allTags"; import IconDisplay from "./IconDisplay"; import InfiniteScroll from "react-infinite-scroll-component"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Checkbox } from "@/components/ui/checkbox"; import { Spinner } from "./ui/spinner"; import { CommandIcon } from "lucide-react"; import { OnlineServer } from "@/lib/types/mh-server"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { useEffectOnce } from "@/lib/useEffectOnce"; import ServerCard from "./ServerCard"; import events from "@/lib/commandEvent"; import { BorderBeam } from "@/components/effects/border-beam"; import { Label } from "./ui/label"; import { useRouter } from "@/lib/useRouter"; export default function ServerList() { const [loading, setLoading]: any = useState(true); const [randomText, setRandomText] = useState(""); const [motdList, setMotdList] = useState({}); const allText = [""]; const getRandomText = () => { return allText[Math.floor(Math.random() * allText.length)]; }; const [templateFilter, setTemplateFilter] = useState(false); const [random, setRandom] = useState(false); const [serverList, setServerList] = useState(new ServersList([])); const [textCopied, setTextCopied] = useState(false); const bigger = async (server: OnlineServer) => server.playerData.playerCount > 15; const smaller = async (server: OnlineServer) => !server.staticInfo.alwaysOnline && server.playerData.playerCount < 15 && server.playerData.playerCount > 7; const [nameFilters, setNameFilters] = useState({}); const [inErrState, setErrState] = useState(false); const [servers, setServers] = useState>([]); const router = useRouter(); const [filters, setFilters] = useState< Array<(server: OnlineServer) => Promise> >([]); const [randomData, setRandomData] = useState( undefined ); useEffectOnce(() => { setRandomText(getRandomText()); serverList .fetchDataAndFilter() .then(() => { serverList.moveListDown(); let stringList: Array<{ server: string; motd: string }> = []; let obj: any = {}; serverList.currentServers.forEach((b) => { stringList.push({ motd: b.motd, server: b.name }); }); serverList.getMOTDs(stringList).then((c) => { var updatedSL = motdList; c.forEach((b: { server: string; motd: string }) => { updatedSL[b.server] = b.motd; }); setMotdList(updatedSL); setServers(serverList.currentServers); setLoading(false); }); }) .catch(() => setErrState(true)); }); if (inErrState) { return ( <>

Hmm. Something is wrong. Reload the page.
); } if (loading) { return ( <>
); } return ( <>
= 3200 ? "bg-clip-text text-transparent bg-gradient-to-r from-cyan-500 to-blue-500" : "" } > Servers online{" "}
} className="relative z-0" desc={
= 3200 ? "bg-clip-text text-transparent bg-gradient-to-r from-cyan-500 to-blue-500 " : "" } > {serverList.getExtraData().total_servers.toString()}
{serverList.getExtraData().total_servers >= 3200 && ( The server amount is over 3.2k, meaning that new servers have to go into a queue before being able to be online.{" "}
(the server count isn't entirely accurate, so sometimes you might not go into a queue even when the server count is at 3.2k)
)}
} icon={Network} > {serverList.getExtraData().total_servers >= 3200 && ( )} {serverList.currentServers[0] != undefined ? serverList.currentServers[0].name : "None"}{" "} {serverList.currentServers[0] != undefined && ( )} } icon={Sun} />
{ toast.promise( new Promise((g, b) => { if (v == "smaller") { setTemplateFilter(true); var filt = nameFilters; filt["smaller-tf"] = true; filt["bigger-tf"] = false; setNameFilters(filt); var filt2 = filters; filt2.push(smaller); if (filt2.includes(bigger)) { filt2.splice(filt2.indexOf(bigger), 1); } setFilters(filt2); serverList.editFilters(filters); serverList.fetchDataAndFilter().then(() => { serverList.moveListDown(); let stringList: Array<{ server: string; motd: string; }> = []; let obj: any = {}; serverList.currentServers.forEach((b) => { stringList.push({ motd: b.motd, server: b.name }); }); serverList.getMOTDs(stringList).then((c) => { var updatedSL = motdList; c.forEach((b: { server: string; motd: string }) => { updatedSL[b.server] = b.motd; }); setMotdList(updatedSL); setServers(serverList.currentServers); g(undefined); }); }); } else if (v == "bigger") { setTemplateFilter(true); var filt = nameFilters; filt["smaller-tf"] = false; filt["bigger-tf"] = true; setNameFilters(filt); var filt2 = filters; filt2.push(bigger); filt2.splice(filt2.indexOf(smaller), 1); setFilters(filt2); serverList.editFilters(filters); serverList.fetchDataAndFilter().then(() => { serverList.moveListDown(); let stringList: Array<{ server: string; motd: string; }> = []; let obj: any = {}; serverList.currentServers.forEach((b) => { stringList.push({ motd: b.motd, server: b.name }); }); serverList.getMOTDs(stringList).then((c) => { var updatedSL = motdList; c.forEach((b: { server: string; motd: string }) => { updatedSL[b.server] = b.motd; }); setMotdList(updatedSL); setServers(serverList.currentServers); g(undefined); }); }); } else { var filt = nameFilters; filt["smaller-tf"] = false; filt["bigger-tf"] = false; setNameFilters(filt); setTemplateFilter(false); var filt2 = filters; filt2.splice(filt2.indexOf(smaller), 1); filt2.splice(filt2.indexOf(bigger), 1); setFilters(filt2); console.log(filters, filters.includes(smaller)); serverList.editFilters(filters); serverList.fetchDataAndFilter().then(() => { serverList.moveListDown(); let stringList: Array<{ server: string; motd: string; }> = []; let obj: any = {}; serverList.currentServers.forEach((b) => { stringList.push({ motd: b.motd, server: b.name }); }); serverList.getMOTDs(stringList).then((c) => { var updatedSL = motdList; c.forEach((b: { server: string; motd: string }) => { updatedSL[b.server] = b.motd; }); setMotdList(updatedSL); setServers(serverList.currentServers); g(undefined); }); }); } }), { error: "Error while changing filters", loading: "Changing filters...", success: "Changed filters!", } ); }} defaultValue={(() => { if (nameFilters["smaller-tf"]) { return "smaller"; } else if (nameFilters["bigger-tf"]) { return "bigger"; } else { return "none"; } })()} >

Server have 15-7 players, cannot be{" "} Always Online

Server has 16 players or more



Tags
{allTags.map((tag) => (
{tag.docsName && tag.__filter == undefined && (
{ return nameFilters["t-" + tag.docsName]; })()} onCheckedChange={async (b) => { var filt = nameFilters; filt["t-" + tag.docsName] = b; setNameFilters(filt); if (b) { var filt2 = filters; filt2.push(tag.condition); setFilters(filt2); } else { var filt2 = filters; filt2.splice(filt2.indexOf(tag.condition), 1); setFilters(filt2); } serverList.editFilters(filters); serverList.fetchDataAndFilter().then(() => { serverList.moveListDown(); let stringList: Array<{ server: string; motd: string; }> = []; let obj: any = {}; serverList.currentServers.forEach((b) => { stringList.push({ motd: b.motd, server: b.name }); }); serverList.getMOTDs(stringList).then((c) => { var updatedSL = motdList; c.forEach((b: { server: string; motd: string }) => { updatedSL[b.server] = b.motd; }); setMotdList(updatedSL); setServers(serverList.currentServers); }); }); }} />
)}
))}
Categories
{allCategories.map((categorie) => (
{ var filt = nameFilters; filt["c-" + categorie.name] = b; setNameFilters(filt); if (b) { var filt2 = filters; filt2.push(categorie.condition); setFilters(filt2); } else { var filt2 = filters; filt2.splice(filt2.indexOf(categorie.condition), 1); setFilters(filt2); } serverList.editFilters(filters); serverList.fetchDataAndFilter().then(() => { serverList.moveListDown(); let stringList: Array<{ server: string; motd: string }> = []; let obj: any = {}; serverList.currentServers.forEach((b) => { stringList.push({ motd: b.motd, server: b.name }); }); serverList.getMOTDs(stringList).then((c) => { var updatedSL = motdList; c.forEach((b: { server: string; motd: string }) => { updatedSL[b.server] = b.motd; }); setMotdList(updatedSL); setServers(serverList.currentServers); }); }); }} checked={(() => { return nameFilters["c-" + categorie.name]; })()} />
))}
router.push("/sort/favorites")} >
{randomData == undefined && <>No data to randomize} {randomData != undefined && ( {randomData.name} {randomData.author != undefined ? (
by {randomData.author}
) : (
)}
{randomData.playerData.playerCount == 0 ? (
) : (
)} {randomData.playerData.playerCount}{" "} {randomData.playerData.playerCount == 1 ? "player" : "players"}{" "} currently online
Server IP

{randomData.name}.minehut.gg{" "} )}

{ serverList.moveListDown(); let stringList: Array<{ server: string; motd: string }> = []; serverList.currentServers.forEach((b) => { stringList.push({ motd: b.motd, server: b.name }); }); serverList.getMOTDs(stringList).then((c) => { var updatedSL = motdList; c.forEach((b: { server: string; motd: string }) => { updatedSL[b.server] = b.motd; }); setMotdList(updatedSL); setServers(serverList.currentServers); setLoading(false); }); }} loader={} endMessage={

You've seen it all", }} /> } style={{ overflow: "hidden !important", paddingLeft: 6 }} >

{servers.map((b: any) => ( <> ))}
); } export function TagShower(props: { server: OnlineServer; className?: string; unclickable?: boolean; }) { const [loading, setLoading] = useState(true); const [compatiableTags, setCompatiableTags] = useState< Array<{ name: string; docsName?: string; tooltip: string; htmlDocs: string; role: | "default" | "destructive" | "outline" | "secondary" | "red" | "orange" | "yellow" | "green" | "lime" | "blue" | "teal" | "cyan" | "violet" | "indigo" | "purple" | "fuchsia" | "pink"; }> >([]); useEffectOnce(() => { if (loading) { allTags.forEach((tag) => { tag.condition(props.server).then((b) => { if (b && tag.primary) { tag.name(props.server).then((n) => { compatiableTags.push({ name: n, docsName: tag.docsName, tooltip: tag.tooltipDesc, htmlDocs: tag.htmlDocs, role: tag.role == undefined ? "secondary" : tag.role, }); setLoading(false); }); } }); }); } }); if (loading) { return <>; } return ( <> {compatiableTags.map((t) => ( <> {props.unclickable && ( {t.name} )} {!props.unclickable && ( {t.name}
{t.tooltip}
Click the tag to learn more about it.
{'"'} {t.docsName == undefined ? t.name : t.docsName} {'"'} documentation
)} ))} ); }