OOKNET                             [ /  search the index  ]  
──────────────────────────────────────────────────────────────────────────────────────
══════════════════════════════════════════════════════════════════════════════════════
OOKNET   [ /  search  ]  
────────────────────────────────────────────────
════════════════════════════════════════════════
 
 
master @ 88 LINES
 
[ HISTORY ]  [ UP ]
 

// Realm autocomplete handler

import { getRealms, getPlayers } from "../indexes/cache.js";
import type { AutocompleteChoice } from "../types.js";
import { DISCORD_LIMITS } from "../constants.js";

/**
 * Handles autocomplete for realm selection
 * Filters by region and fuzzy matches on realm name
 * Optionally filters by player name if provided
 */
export async function autocompleteRealm(
  query: string,
  region?: "us" | "eu" | "kr" | "tw",
  playerName?: string,
): Promise<AutocompleteChoice[]> {
  // if no region specified, return empty (user must select region first)
  if (!region) {
    return [
      {
        name: "Please select a region first",
        value: "none",
      },
    ];
  }

  let realms = await getRealms(region);
  const lowerQuery = query.toLowerCase().trim();

  // if player name is provided, filter realms to only those where player exists
  if (playerName && playerName.trim() !== "") {
    const players = await getPlayers();
    const lowerPlayerName = playerName.toLowerCase().trim();

    // find all players matching the name in this region
    const matchingPlayers = players.filter(
      (p) =>
        p.name.toLowerCase().includes(lowerPlayerName) &&
        p.region === region.toLowerCase(),
    );

    // extract unique realm slugs from matching players
    const playerRealms = new Set(matchingPlayers.map((p) => p.realm_slug));

    // filter realms to only those where the player exists
    realms = realms.filter((r) => playerRealms.has(r.slug));

    // if no realms found, show helpful message
    if (realms.length === 0) {
      return [
        {
          name: `No players named "${playerName}" found in ${region.toUpperCase()}
`,
          value: "none",
        },
      ];
    }
  }

  // sort by player count (most popular first)
  const sortedRealms = [...realms].sort(
    (a, b) => b.player_count - a.player_count,
  );

  // if no query, return top realms
  if (!lowerQuery) {
    return sortedRealms
      .slice(0, DISCORD_LIMITS.MAX_AUTOCOMPLETE_CHOICES)
      .map((r) => ({
        name: r.name,
        value: r.slug,
      }));
  }

  // filter realms by name or slug
  const filtered = sortedRealms
    .filter(
      (r) =>
        r.name.toLowerCase().includes(lowerQuery) ||
        r.slug.toLowerCase().includes(lowerQuery),
    )
    .slice(0, DISCORD_LIMITS.MAX_AUTOCOMPLETE_CHOICES);

  return filtered.map((r) => ({
    name: r.name,
    value: r.slug,
  }));
}

// Realm autocomplete handler

import { getRealms, getPlayers } from "../in
dexes/cache.js";
import type { AutocompleteChoice } from "../
types.js";
import { DISCORD_LIMITS } from "../constants
.js";

/**
 * Handles autocomplete for realm selection
 * Filters by region and fuzzy matches on re
alm name
 * Optionally filters by player name if prov
ided
 */
export async function autocompleteRealm(
  query: string,
  region?: "us" | "eu" | "kr" | "tw",
  playerName?: string,
): Promise<AutocompleteChoice[]> {
  // if no region specified, return empty (u
ser must select region first)
  if (!region) {
    return [
      {
        name: "Please select a region first"
,
        value: "none",
      },
    ];
  }

  let realms = await getRealms(region);
  const lowerQuery = query.toLowerCase().tri
m();

  // if player name is provided, filter real
ms to only those where player exists
  if (playerName && playerName.trim() !== ""
) {
    const players = await getPlayers();
    const lowerPlayerName = playerName.toLow
erCase().trim();

    // find all players matching the name in
 this region
    const matchingPlayers = players.filter(
      (p) =>
        p.name.toLowerCase().includes(lowerP
layerName) &&
        p.region === region.toLowerCase(),
    );

    // extract unique realm slugs from match
ing players
    const playerRealms = new Set(matchingPla
yers.map((p) => p.realm_slug));

    // filter realms to only those where the
 player exists
    realms = realms.filter((r) => playerReal
ms.has(r.slug));

    // if no realms found, show helpful mess
age
    if (realms.length === 0) {
      return [
        {
          name: `No players named "${playerN
ame}" found in ${region.toUpperCase()}`,
          value: "none",
        },
      ];
    }
  }

  // sort by player count (most popular firs
t)
  const sortedRealms = [...realms].sort(
    (a, b) => b.player_count - a.player_coun
t,
  );

  // if no query, return top realms
  if (!lowerQuery) {
    return sortedRealms
      .slice(0, DISCORD_LIMITS.MAX_AUTOCOMPL
ETE_CHOICES)
      .map((r) => ({
        name: r.name,
        value: r.slug,
      }));
  }

  // filter realms by name or slug
  const filtered = sortedRealms
    .filter(
      (r) =>
        r.name.toLowerCase().includes(lowerQ
uery) ||
        r.slug.toLowerCase().includes(lowerQ
uery),
    )
    .slice(0, DISCORD_LIMITS.MAX_AUTOCOMPLET
E_CHOICES);

  return filtered.map((r) => ({
    name: r.name,
    value: r.slug,
  }));
}
 
──────────────────────────────────────────────────────────────────────────────────────
OOKNET
────────────────────────────────────────────────
OOKNET