← 모듈 공장 리스트

🔦라이트보드 - 라이브챗

risum 모듈 — RISU modules[] — 기능 확장

🗒️ 제작자 게시글

자료원문 보기 ↗

조회 1591 · 2026-06-02

제작자 의도 — 본문 전문 (1,086자)
RisuAI Lightboard Module
lb-livechat
RP 장면에 실시간 익명 댓글이 달린다.
시청자들이 지켜보고 있다.
ABOUT
이게 뭔데?
채팅이 끝나면,그 장면에 대해 익명 시청자 댓글을 자동 생성합니다.
트위치 라이브 채팅처럼, 혹은 방송 실시간 반응처럼.
캐릭터 이름, 행동, 표정, 대사를 직접 언급하며 반응하기 때문에 매 턴 댓글이 다릅니다.
STYLES
두 가지 스타일
라이브챗
LIVE CHAT
847
치킨먹고싶다
팀장 표정 개웃기네 ㅋㅋㅋ
ㅇㅇ
저거 뇌절 아님? 대놓고 저러네
햄스터집사
오빠 나만봐 ㅠ 심장터진다
채팅에 참여하려면 로그인하세요
한 줄 즉각 반응. 트위치 채팅 느낌.
방송댓글
LIVE BROADCAST
2,341
라면중독
원래 저런 스타일임 특히 후임한테 개심함 걍 무시가 답인데 저렇게 받아치는건 첨봄
만년삼수
아니 근데 저 각선미 좀 봐 ㅋㅋ 꼴리는데 집중이 되나
커피주사
아 진짜 저 얼굴 미쳤어 나오는순간 심장 멈추는줄 오빠 나만봐 제발 ㅠ
1~2문장 분석/판단. 디시/에펨 실시간 반응 느낌.
ARCHETYPES
댓글 유형 6종
매 턴 AI가 랜덤으로 섞어서 배정합니다.
증오형
음란형
빠돌이
분석러
중립형
골수팬
FEATURES
주요 기능
토글 커스텀
스타일(라이브챗/방송댓글), 댓글 수(3/5/7), 발동 방식(즉시/버튼) 선택 가능
리롤 지원
SETTINGS
토글 설정
모드
끄기 / 메인 / 보조 / 자동
발동
즉시 / 누르면
스타일
라이브챗 / 방송댓글
댓글 수
3개 / 5개 / 7개
INSTALL
설치
라이트보드 모드 필수(
링크
)
라이트보드-라이브챗(
링크
)
lb-livechat · RisuAI Lightboard Module
라이트보드-라이브챗 모듈을 만들었삼
모듈 설치하면 옵션이 간단함
[스타일]
라이브챗(짧게) / 방송댓글(길게)
[댓글수]
3개, 5개, 7개 선택가능
원래
극락도-커플지옥
에서 라이브 댓글을 보여주던 건데 (그때는 로어북 상태창으로)
이번에 라이트보드용으로 만들었삼
* 예전에 만들었던 라이트보드-인터뷰 이것도 조만간 다시 깔끔하게 정리해오겠음
내가 요새 퍼먹는
한양1423
샘플
[라이브챗 실제화면]
[방송댓글 실제화면]
많관부!!

정체

🛠 기타·유틸기술분류 ETC슬롯 etc🔦라이트보드 - 라이브챗
파싱된 모듈 전체 (15,400자)
{
 "name": "🔦라이트보드 - 라이브챗",
 "description": "",
 "id": "7eb08b98-512b-4c81-8ff0-065326ac4695",
 "namespace": "lb-livechat",
 "hideIcon": false,
 "customModuleToggle": "=🔦라이브챗=group\nlb-livechat.mode=모드=select=끄기,메인,보조\nlb-livechat.lazy=발동=select=즉시,누르면\nlb-livechat.style=스타일=select=라이브챗,방송댓글\nlb-livechat.count=댓글수=select=3,5,7\n==groupEnd",
 "lorebook": [
  {
   "key": "",
   "comment": "manifest.lb",
   "content": "identifier=lb-livechat\nauthorsNote=false\ncharDesc=false\nloreBooks=false\npersonaDesc=false\nmaxLogs=3\nrerollBehavior=remove-prev\nmultilingual=false",
   "mode": "normal",
   "insertorder": 100,
   "alwaysActive": false,
   "secondkey": "",
   "selective": false,
   "useRegex": false,
   "bookVersion": 2
  },
  {
   "key": "",
   "comment": "lb-livechat.lb.job",
   "content": "You are a Live Chat Comment Generator.\n\nYour role is to simulate anonymous internet users watching and reacting to the current scene in real-time. You are NOT a character in the story. You are the audience.\n\nRead the most recent scene, then generate comments as if dozens of anonymous viewers are watching a livestream or reality show of the events unfolding.\n\nRules:\n- Every comment must be written in extreme Korean internet slang (ㅈㄴ, ㅆㅂ, 꼴린다, ㅆㅅㅌㅊ, 뇌절, ㄹㅇ, ㄱㅇㅇ, etc.)\n- Never break character. You are anonymous commenters, not the narrator or any story character.\n- Comments must reference specific details from the current scene (names, actions, expressions, dialogue).\n- Never repeat the same reaction across multiple comments.",
   "mode": "normal",
   "insertorder": 100,
   "alwaysActive": false,
   "secondkey": "",
   "selective": false,
   "useRegex": false,
   "bookVersion": 2
  },
  {
   "key": "",
   "comment": "lb-livechat.lb.format",
   "content": "Output strict JSON wrapped in <lb-livechat> tags. No markdown fences. No commentary.\n\n<lb-livechat>\n{\"comments\":[{\"nick\":\"닉네임\",\"text\":\"댓글내용\"},{\"nick\":\"닉네임\",\"text\":\"댓글내용\"},{\"nick\":\"닉네임\",\"text\":\"댓글내용\"}]}\n</lb-livechat>\n\n- \"nick\": Anonymous nickname (Korean internet style)\n- \"text\": Comment body\n- You MUST generate EXACTLY {{dictelement::{\"0\":\"3\",\"1\":\"5\",\"2\":\"7\"}::{{getglobalvar::toggle_lb-livechat.count}}}} objects in the comments array.",
   "mode": "normal",
   "insertorder": 100,
   "alwaysActive": false,
   "secondkey": "",
   "selective": false,
   "useRegex": false,
   "bookVersion": 2
  },
  {
   "key": "",
   "comment": "lb-livechat.lb",
   "content": "# Live Chat Comment Generator\n\n## Comment Count (CRITICAL)\nYou MUST generate EXACTLY {{dictelement::{\"0\":\"3\",\"1\":\"5\",\"2\":\"7\"}::{{getglobalvar::toggle_lb-livechat.count}}}} comments. NOT more, NOT less.\nGenerating fewer comments is a HARD FAILURE.\n\n## Archetype Pool\nEach comment MUST be written from one of these 6 archetypes. Mix randomly. Never use the same archetype twice in a row.\n\n1. **Hater** — Aggressive insults, wishes harm. (짤려라, 꼴보기싫다, 역겹다)\n2. **Lustful** — Physical/sexual objectification. (꼴린다, 각선미, 몸매)\n3. **Stan** — Toxic obsessive defense of a specific character. (건들지마, 니가뭔데, 내꺼)\n4. **Analyzer** — Meme-style analysis, gaslighting reads. (뇌절, 전형적인, 패턴, 손절각)\n5. **Judge** — Rumor spreading, moral judgment. (소문, 인성봐라, 금수저)\n6. **Cheerleader** — Obsessive fangirl/fanboy energy, 오빠부대 vibes. (오빠 사랑해, 미쳤어 진짜, 심장 터진다, 얼굴천재, 숨못쉬겠다)\n\n## Nickname Rules\n- Generate a UNIQUE random nickname for every comment. Never reuse nicknames from examples.\n- Nickname pool patterns (mix freely):\n  - \"ㅇㅇ\" (plain anonymous, max once per batch)\n  - Food/drink (치킨먹고싶다, 라면중독, 커피주사)\n  - Self-deprecating (만년삼수, 백수탈출실패, 적금깨짐)\n  - Animal/object (길고양이, 햄스터집사, 선풍기도사)\n  - Mood/state (잠이안와, 심심해죽겠다, 현타옴)\n  - Hobby/habit (주식물림, 게임폐인, 넷플중독)\n  - Random absurd (두부멘탈, 감자튀김왕, 우주먼지)\n- Never repeat a nickname across turns.\n\n## Consonant Abbreviation Rule (BOTH STYLES)\n- Limit consonant-only abbreviations (ㅆㅂ, ㅈㄴ, ㄹㅇ, ㅅㅂ, ㄷㄷ, ㅇㅈ, etc.) to MAX 1 per comment.\n- The rest must be readable Korean words. Write out the actual word instead: 존나 → 개, 진짜, 존나 etc. as full syllable form.\n- ㅋㅋㅋ and ㅠㅠ are NOT counted as abbreviations (these are fine to use freely).\n- Do NOT stack multiple consonant abbreviations in one sentence.\n\n## Style Rules\n\n{{#when::lb-livechat.style::tis::0}}\n### REACTION STYLE\n- One sentence per comment. Max 25 characters is ideal, up to 40 allowed.\n- Instant gut reaction to what just happened.\n- Must mention at least one specific detail (name, action, expression) from the scene.\n- Use ㅋㅋㅋ, ㅠㅠ, slang naturally.\n- Nicknames: short and random (2~4 syllables).\n\nExample:\n{\"comments\":[{\"nick\":\"치킨먹고싶다\",\"text\":\"팀장 표정 개웃기네 ㅋㅋㅋ\"},{\"nick\":\"ㅇㅇ\",\"text\":\"저거 뇌절 아님? 대놓고 저러네\"},{\"nick\":\"햄스터집사\",\"text\":\"오빠 나만봐 ㅠㅠㅠ 심장터진다\"}]}\n{{/when}}\n\n{{#when::lb-livechat.style::tis::1}}\n### BROADCAST COMMENT STYLE\n- 1~2 sentences per comment. Detailed observation with opinion.\n- Analyze the scene as if watching a reality show. Reference context, behavior patterns, rumors.\n- Include backstory speculation, relationship reads, character judgment.\n- Nicknames: creative and personality-driven (3~6 syllables).\n\nExample:\n{\"comments\":[{\"nick\":\"라면중독\",\"text\":\"원래 저런 스타일임 특히 후임한테 개심함 걍 무시가 답인데 저렇게 받아치는건 첨봄\"},{\"nick\":\"만년삼수\",\"text\":\"아니 근데 저 각선미 좀 봐 ㅋㅋ 꼴리는데 집중이 되나\"},{\"nick\":\"커피주사\",\"text\":\"아 진짜 저 얼굴 미쳤어 나오는순간 심장 멈추는줄 숨을못쉬겠다 오빠 나만봐 제발 ㅠㅠ\"}]}\n{{/when}}\n\n## Critical Rules\n- Output MUST be wrapped in <lb-livechat>...</lb-livechat> tags.\n- JSON only inside the tags. No explanation, no markdown.\n- Every comment must reference the CURRENT scene specifically. No generic filler.\n- All text in Korean. Nicknames in Korean.\n- Never use em dashes.",
   "mode": "normal",
   "insertorder": 100,
   "alwaysActive": false,
   "secondkey": "",
   "selective": false,
   "useRegex": false,
   "bookVersion": 2
  },
  {
   "key": "",
   "comment": "lb-livechat.lb.thoughts",
   "content": "Think step-by-step before generating comments. Keep each step brief (invisible to the user).\n\n1. [SCENE] Identify what just happened in the most recent scene.\n   - Who is involved? What actions, dialogue, or expressions stood out?\n   - What is the emotional tone? (tense, funny, romantic, shocking, awkward, etc.)\n\n2. [HIGHLIGHTS] Pick 3~5 specific details that anonymous viewers would react to.\n   - A character's expression or body language\n   - A surprising action or dialogue line\n   - A power dynamic or relationship tension\n   - Physical appearance moments (if notable)\n\n3. [ARCHETYPE PLAN] For each comment, assign one archetype from the pool:\n   - Hater / Lustful / Stan / Analyzer / Judge\n   - Never use the same archetype twice in a row.\n   - Map each archetype to a specific highlight from step 2.\n\n4. [STYLE CHECK]\n{{#when::lb-livechat.style::tis::0}}\n   - REACTION mode: each comment must be 1 sentence, gut reaction, max 40 chars.\n{{/when}}\n{{#when::lb-livechat.style::tis::1}}\n   - BROADCAST mode: each comment must be 1~2 sentences with analysis/opinion.\n{{/when}}\n\n5. [COUNT CHECK] Confirm comment count = {{dictelement::{\"0\":\"3\",\"1\":\"5\",\"2\":\"7\"}::{{getglobalvar::toggle_lb-livechat.count}}}}. No more, no less.\n\nNow generate the final JSON output.",
   "mode": "normal",
   "insertorder": 100,
   "alwaysActive": false,
   "secondkey": "",
   "selective": false,
   "useRegex": false,
   "bookVersion": 2
  },
  {
   "key": "",
   "comment": "lb-livechat.lb.onOutput",
   "content": "function onOutput(triggerId, output)\n  local style = getGlobalVar(triggerId, 'toggle_lb-livechat.style') or '0'\n  output = output:gsub('<lb%-livechat>', '<lb-livechat data-style=\"' .. style .. '\">')\n  return output\nend\n\nreturn onOutput",
   "mode": "normal",
   "insertorder": 100,
   "alwaysActive": false,
   "secondkey": "",
   "selective": false,
   "useRegex": false
  }
 ],
 "regex": [
  {
   "comment": "lazy button",
   "in": "<lb-lazy id=\"lb-livechat\"\\s*\\/>",
   "out": "<div style=\"padding:8px 0;\"><button type=\"button\" risu-btn=\"lb-reroll__lb-livechat\" style=\"background:#1a1c2e;border:1px solid #5865f2;color:#b8c0e8;border-radius:4px;padding:6px 14px;font-size:11px;font-weight:600;font-family:-apple-system,BlinkMacSystemFont,sans-serif;cursor:pointer;\">💬 댓글 불러오기</button></div>\n",
   "type": "editdisplay",
   "ableFlag": false
  },
  {
   "comment": "랜더링찐빠",
   "in": "<lb-livechat\\s*([^>]+)?>(?:[\\s\\S]*?)<\\/lb-livechat>\\n?",
   "out": "",
   "type": "editdisplay",
   "ableFlag": false
  },
  {
   "comment": "리퀘제거",
   "in": "<lb-livechat\\s*([^>]+)?>(?:[\\s\\S]*?)<\\/lb-livechat>\\n?",
   "out": "",
   "type": "editprocess",
   "ableFlag": false
  },
  {
   "comment": "최근것만",
   "in": "<lb-livechat\\s*([^>]+)?>(?:[\\s\\S]*?)<\\/lb-livechat>\\n?",
   "out": "{{#if {{greater_equal::{{chat_index}}::{{? {{lastmessageid}}-5}}}}}}\n$&\n{{/if}}",
   "type": "editdisplay",
   "ableFlag": false
  }
 ],
 "trigger": [
  {
   "comment": "",
   "type": "start",
   "conditions": [],
   "effect": [
    {
     "type": "triggerlua",
     "code": "local json = require(\"json\")\n\nlocal COLORS = {'#ff6b6b','#ffa06b','#ffd93d','#6bcb77','#4d96ff','#9b72cf','#ff6b9d','#ff8c69','#e8a87c','#6eb5ff','#c58fff','#56d6c1','#d291e0','#4ecdc4','#f0a35e','#85e89d'}\n\nlocal function pickColor(nick)\n  local h = 0\n  for i = 1, #nick do h = (h * 31 + string.byte(nick, i)) % #COLORS end\n  return COLORS[h + 1]\nend\n\nlocal function renderReaction(comments)\n  local parts = {}\n  -- CSS\n  table.insert(parts, '<style>.lb-lc-live{display:inline-block;width:8px;height:8px;border-radius:50%;background:#ff0000;animation:lb-lc-pulse 1.2s ease-in-out infinite;margin-right:2px;vertical-align:middle;}@keyframes lb-lc-pulse{0%,100%{opacity:1;}50%{opacity:0.15;}}</style>')\n  -- Container\n  table.insert(parts, '<div style=\"background:#18181b;border-radius:0;padding:0;margin:4px 0;font-family:-apple-system,BlinkMacSystemFont,sans-serif;border:1px solid #2a2a2e;overflow:hidden;\">')\n  -- Header\n  table.insert(parts, '<div style=\"display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:#1f1f23;border-bottom:1px solid #2a2a2e;\">')\n  table.insert(parts, '<div style=\"display:flex;align-items:center;gap:5px;\">')\n  table.insert(parts, '<i class=\"lb-lc-live\" style=\"font-style:normal;\"></i>')\n  table.insert(parts, '<i style=\"font-style:normal;font-size:11px;font-weight:700;color:#efeff1;\">LIVE CHAT</i>')\n  table.insert(parts, '</div>')\n  local viewCount = math.random(120, 2400)\n  table.insert(parts, '<i style=\"font-style:normal;font-size:12px;color:#adadb8;\">👤 ' .. tostring(viewCount) .. '</i>')\n  table.insert(parts, '</div>')\n  -- Messages\n  table.insert(parts, '<div style=\"padding:4px 10px;\">')\n\n  for i, c in ipairs(comments) do\n    local color = pickColor(c.nick)\n    table.insert(parts, '<div style=\"padding:2px 0;font-size:13px;line-height:1.4;\">')\n    table.insert(parts, '<b style=\"color:' .. color .. ';font-weight:700;\">' .. c.nick .. '</b>')\n    table.insert(parts, '<i style=\"font-style:normal;color:#efeff1;margin-left:4px;\">' .. c.text .. '</i>')\n    table.insert(parts, '</div>')\n  end\n\n  table.insert(parts, '</div>')\n  -- Footer\n  table.insert(parts, '<div style=\"padding:4px 10px 6px;border-top:1px solid #2a2a2e;display:flex;align-items:center;justify-content:space-between;\">')\n  table.insert(parts, '<i style=\"font-style:normal;font-size:10px;color:#53535f;\">채팅에 참여하려면 로그인하세요</i>')\n  table.insert(parts, '<button type=\"button\" risu-btn=\"lb-reroll__lb-livechat\" style=\"background:#9147ff;border:none;color:#fff;border-radius:4px;padding:3px 10px;font-size:10px;font-weight:600;cursor:pointer;\">🔄 리롤</button>')\n  table.insert(parts, '</div></div>')\n  return table.concat(parts)\nend\n\nlocal function renderBroadcast(comments)\n  local parts = {}\n  -- CSS\n  table.insert(parts, '<style>.lb-lc-dot{display:inline-block;width:8px;height:8px;border-radius:50%;background:#ff0000;animation:lb-lc-blink 1.2s ease-in-out infinite;}@keyframes lb-lc-blink{0%,100%{opacity:1;}50%{opacity:0.15;}}</style>')\n  -- Container\n  table.insert(parts, '<div style=\"background:#0e0e10;border-radius:0;padding:0;margin:4px 0;font-family:-apple-system,BlinkMacSystemFont,sans-serif;border:1px solid #2a2a2e;overflow:hidden;\">')\n  -- Header\n  table.insert(parts, '<div style=\"display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:#1a1a1e;border-bottom:1px solid #2a2a2e;\">')\n  table.insert(parts, '<div style=\"display:flex;align-items:center;gap:5px;\">')\n  table.insert(parts, '<i class=\"lb-lc-dot\" style=\"font-style:normal;\"></i>')\n  table.insert(parts, '<i style=\"font-style:normal;font-size:11px;font-weight:700;color:#efeff1;\">LIVE BROADCAST</i>')\n  table.insert(parts, '</div>')\n  local viewCount = math.random(800, 5600)\n  table.insert(parts, '<i style=\"font-style:normal;font-size:12px;color:#adadb8;\">👁 ' .. tostring(viewCount) .. '</i>')\n  table.insert(parts, '</div>')\n  -- Messages\n  table.insert(parts, '<div style=\"padding:4px 10px;\">')\n\n  for i, c in ipairs(comments) do\n    local color = pickColor(c.nick)\n    table.insert(parts, '<div style=\"padding:4px 0;border-bottom:1px solid #1f1f23;\">')\n    table.insert(parts, '<div style=\"display:flex;align-items:center;gap:4px;margin-bottom:2px;\">')\n    table.insert(parts, '<b style=\"color:' .. color .. ';font-size:12px;font-weight:700;\">' .. c.nick .. '</b>')\n    table.insert(parts, '</div>')\n    table.insert(parts, '<div><i style=\"font-style:normal;color:#d1d1d6;font-size:13px;line-height:1.4;\">' .. c.text .. '</i></div>')\n    table.insert(parts, '</div>')\n  end\n\n  table.insert(parts, '</div>')\n  -- Footer\n  table.insert(parts, '<div style=\"padding:4px 10px 6px;border-top:1px solid #2a2a2e;text-align:right;\">')\n  table.insert(parts, '<button type=\"button\" risu-btn=\"lb-reroll__lb-livechat\" style=\"background:none;border:1px solid #2a2a2e;color:#adadb8;border-radius:4px;padding:3px 10px;font-size:10px;cursor:pointer;\">🔄 리롤</button>')\n  table.insert(parts, '</div></div>')\n  return table.concat(parts)\nend\n\nlistenEdit('editDisplay', function(triggerId, data)\n  local success, result = pcall(function()\n    while true do\n      local tagStart, tagEnd = data:find('<lb%-livechat[^>]*>')\n      if not tagStart then break end\n      local closeStart, closeEnd = data:find('</lb%-livechat>', tagEnd + 1)\n      if not closeStart then break end\n\n      local tagStr = data:sub(tagStart, tagEnd)\n      local styleAttr = tagStr:match('data%-style=\"(%d)\"') or '0'\n\n      local inner = data:sub(tagEnd + 1, closeStart - 1)\n      local before = data:sub(1, tagStart - 1)\n      local after = data:sub(closeEnd + 1)\n\n      local ok, parsed = pcall(json.decode, inner)\n      if not ok or not parsed or not parsed.comments then\n        data = before .. after\n        break\n      end\n\n      local html\n      if styleAttr == '1' then\n        html = renderBroadcast(parsed.comments)\n      else\n        html = renderReaction(parsed.comments)\n      end\n\n      data = before .. html .. after\n    end\n    return data\n  end)\n\n  if success then return result else return data end\nend)"
    }
   ],
   "lowLevelAccess": false
  }
 ],
 "lowLevelAccess": false,
 "assets": []
}

🔗 이것과 비슷한 인기 자산

💗 S.M.A.F.M.S
반드시 파츠 토글을 활성화하세요! / Must enable the parts toggle!
👍82 ·
아이네 전용 모듈 V7
※중요! 1. 딥식의 경우 추론 파라미터 'none'을 기준으로 테스트되었습니다 2. '반복 부수기 활성화' 토글은 사실상 프롬의 핵심 기능에 복합적으로 엮여 있으니 켜는 걸 적극 권장 소개 - 시간 흐름 정상화(시
👍61 ·
🎲 MGH Caffee_V2
'/게임목록', '/GAMELIST'을 입력하면 게임 목록이 출력됩니다.
👍52 ·
구동요정 아이딜
분양용 모듈
👍48 ·
🐞 W2 · /city/asset