CCCPaste
-- cats.lua
-- Скрипт: меню категорий команд (включая 255 команд)
-- Использование:
--   !!cat                -> список категорий
--   !!cat <номер>        -> все команды в категории
--   !!cat <имя_команды>  -> показать категории, где есть команда

local args = _ARGS or {}

-- Категории и команды (включены все 255 команд)
local CATEGORIES = {
  { name = "Утилиты / полезные", cmds = {
    "ohw", "siohw", "hcraes", "652ahs", "1ahs", "2ahs", "652ahs", "1ahs", "2ahs",
    "esrom", "negesrom", "tpyrc", "iruedoced", "iruedocne", "esrever", "esreverym",
    "snart", "emit", "remit", "nwodtnuoc", "trec", "strec", "siohw", "elbatteg",
    "batteg", "elifteg", "eton", "egarotstset", "tdlstset", "ehcac", "bstset",
    "kcats", "elbatesrap", "tsihkcatslaunam", "scnuf", "snoitcnuf", "bif",
    "nogylop", "652ahs", "1ahs", "2ahs", "setybotijome", "bytestoemoji", "hsah", "tpyrc"
  }},
  { name = "Игры и развлечения", cmds = {
    "ecid", "onisac", "aktelur", "ttt", "ecid", "yadyap", "nioc", "tnaw", "aktelur",
    "onisac", "ecid", "pxnar", "ttt", "ihcag", "mihcag", "aktelur", "ozzadnar",
    "onisac", "yadyap", "ecid"
  }},
  { name = "Развлекательные тупняки (рофл)", cmds = {
    "osaym", "doom", "ikhsutsahc", "2ikhsutsahc", "timilfb", "derb", "kek", "ovak",
    "aboba", "aboba", "aboba", "misbitahk", "kopslamron", "ortulamron", "recev",
    "gninrom", "einaminv", "ereh", "heh", "admheh", "yko", "yko", "yko", "fsserp",
    "aysvals", "axulhs", "csdnar", "ozzadnar", "atsap", "atsap"
  }},
  { name = "NSFW / жесть", cmds = {
    "iatneh", "iatnehlanrete", "ihcce", "kcufyag", "nropyageoksted", "gnitsif",
    "hcord", "adzip", "anigav", "ssip", "poop", "ytnap", "kcidkcidwen", "skcid",
    "kcid", "axulhs", "kcus", "srekcus", "hsrehs"
  }},
  { name = "Про участников чата / рейтинги", cmds = {
    "kcid", "skcid", "taf", "sammom", "knab", "pot", "erocs", "serocs", "etar",
    "amrak", "omas", "omas", "avals", "ohw", "siohw", "sresu", "ataDresUllAteg",
    "rebmeMtahCmodnaRteg", "ekatevig", "ytnap", "nortap", "niochb", "knab"
  }},
  { name = "Симуляторы", cmds = {
    "mistanir", "misgnirmi", "mispyf", "misrimem", "misilom", "misavya", "eem",
    "mistanir", "misnwolc", "tpg", "ynopym", "misilom", "misgnirmi", "mistanir"
  }},
  { name = "Технические / кодинг", cmds = {
    "kcufniarb", "negfb", "ferppc", "notip", "tsur", "оelc", "oelc", "saigdok",
    "snoitcnuf", "scnuf", "kcats", "elbatesrap", "negfb", "kcufniarb", "bstset",
    "tpyrc", "hsah", "esrever", "esreverym", "iruedoced", "iruedocne"
  }},
  { name = "Админские / системные", cmds = {
    "nab", "nabnu", "nocr", "odus", "raelc", "craelc", "ehcac", "domlabolg", "nimda",
    "ehcac", "elifteg", "elbatteg", "batteg", "elifg", "nocr", "nocr"
  }},
  { name = "BlastHack / BH-тематика", cmds = {
    "thb", "uhb", "sememhb", "enilnohb", "pudnatshb", "niochb", "kcahtsalb", "thb",
    "uhb", "sememhb", "enilnohb"
  }},
  { name = "Музыка и мультимедиа", cmds = {
    "cisum", "rugmi", "cstnrp", "emem", "emina", "rugmi", "csdnar", "cstnrp", "cisum",
    "yxo", "nacuot"
  }},
  { name = "Прочее", cmds = {
    "ecivda", "kcah", "cam", "lliks", "onehcartop", "yrt", "syrt", "yrt", "rehtie",
    "aisergo", "pmaysav", "yssnnh", "epavdam", "hsarcir", "pir", "ofni", "aedi",
    "hsarc", "molpid", "enod", "krow", "nehwerehwtahw", "ekoj", "kena", "ameop",
    "ohw", "yhwyhw", "ayuhan", "tsetopit", "tiuq", "tiuq", "trec", "strec"
  }}
}



-- Индекс команд -> категории
local CMD_TO_CATS = {}

for i, cat in ipairs(CATEGORIES) do
  for _, cmd in ipairs(cat.cmds) do
    local key = ""
    for j = 1, #cmd do
      local c = string.byte(cmd, j)
      if c >= 65 and c <= 90 then c = c + 32 end
      key = key .. string.char(c)
    end
    CMD_TO_CATS[key] = CMD_TO_CATS[key] or {}
    table.insert(CMD_TO_CATS[key], i)
  end
end


function reverse_str(s)
    local t = {}
    for i = #s, 1, -1 do
        t[#t + 1] = string.sub(s, i, i)
    end
    return table.concat(t)
end


-- Перевод строки в нижний регистр
function lower_str(s)
  local res = ""
  for i = 1, #s do
    local c = string.byte(s, i)
    if c >= 65 and c <= 90 then c = c + 32 end
    res = res .. string.char(c)
  end
  return res
end

-- Проверка наличия подстроки
function contains(haystack, needle)
  for i = 1, #haystack - #needle + 1 do
    local match = true
    for j = 1, #needle do
      if string.byte(haystack, i + j - 1) ~= string.byte(needle, j) then
        match = false
        break
      end
    end
    if match then return true end
  end
  return false
end

-- Показать все категории
function show_categories()
  local lines = {}
  table.insert(lines, "Категории команд:")
  for i, cat in ipairs(CATEGORIES) do
    table.insert(lines, string.format("%d. %s (%d)", i, cat.name, #cat.cmds))
  end
  table.insert(lines, "")
  table.insert(lines, "Использование:")
  table.insert(lines, "!!cat <номер>  — показать команды категории")
  table.insert(lines, "!!cat <имя>    — найти команду по имени и показать категории")
  return table.concat(lines, "\n")
end

-- Показать команды категории
function show_category(idx)
  idx = tonumber(idx)
  if not idx or idx < 1 or idx > #CATEGORIES then
    return "Неверный номер категории. Введите !!cat чтобы увидеть список."
  end
  local cat = CATEGORIES[idx]
  local lines = {}
  table.insert(lines, string.format("%d. %s — команды (%d):", idx, cat.name, #cat.cmds))
  for _, cmd in ipairs(cat.cmds) do
    table.insert(lines, "!!" .. reverse_str(cmd))
  end
  return table.concat(lines, " ")
end

-- Поиск команды
function find_command(name)
  if not name or name == "" then
    return "Укажите имя команды для поиска, например: !!cats dice"
  end

  name = lower_str(name)
  local matches = {}

  if CMD_TO_CATS[name] then
    for _, idx in ipairs(CMD_TO_CATS[name]) do
      table.insert(matches, idx)
    end
  else
    for i, cat in ipairs(CATEGORIES) do
      for _, cmd in ipairs(cat.cmds) do
        if contains(lower_str(cmd), name) then
          table.insert(matches, i)
          break
        end
      end
    end
  end

  if #matches == 0 then
    return "Команда не найдена."
  end

  local seen = {}
  local lines = {}
  table.insert(lines, "Найдено в категориях:")
  for _, idx in ipairs(matches) do
    if not seen[idx] then
      table.insert(lines, string.format("%d. %s", idx, CATEGORIES[idx].name))
      seen[idx] = true
    end
  end
  table.insert(lines, "")
  table.insert(lines, "Для подробного списка выполните: !!cat <номер_категории>")

  return table.concat(lines, "\n")
end

-- Основная логика
if not args or args == "" then
  return show_categories()
end

-- Если args — число -> показать категорию
if tonumber(args) then
  return show_category(tonumber(args))
end

-- Иначе трактуем как имя команды -> найти её
return find_command(args)