Hệ thống Luồng Sự kiện

Hướng dẫn Trình chỉnh sửa Luồng Sự kiện

Xây dựng các quy trình tự động hóa đáng tin cậy cho Chat All In One. Hướng dẫn này sẽ đi qua các vấn đề cơ bản, các nút logic, luồng tín hiệu và các mẹo thực tế mà người sáng tạo thường hỏi nhất (như tránh lặp lại chat và khi nào nên xếp chồng các khối AND/NOT).

0. Định hướng Nhanh

Luồng Sự kiện (Event Flow) là một trình chỉnh sửa dựa trên các nút (node). Mỗi đường dây mang một dữ liệu tải trọng (payload) tin nhắn cộng với trạng thái boolean (true = tiếp tục, false = dừng). Sử dụng nguồn (sources) để đưa sự kiện vào, nút logic để lọc các quyết định, và hành động (actions) để thực hiện việc gì đó (gửi chat, điều khiển overlay, chuyển tiếp tin nhắn, v.v.).

Trình chỉnh sửa này là gì?

Trình chỉnh sửa Luồng Sự kiện là lớp "tự động hóa nâng cao" cho Chat All In One. Nó nằm trên các công tắc popup đơn giản và cho phép bạn viết kịch bản logic định tuyến riêng. Sử dụng nó khi bạn cần:

  • Chuyển tiếp (Relay) chat giữa các dịch vụ có bộ lọc (ví dụ: phản chiếu Twitch sang Discord nhưng chặn các lệnh).
  • Xây dựng các lệnh dựa trên lòng trung thành, trò chơi từ khóa, hoặc cổng quay số trúng thưởng với logic AND/OR/NOT.
  • Kích hoạt overlay tùy chỉnh, âm thanh, cảnh OBS, hoặc webhook dựa trên dữ liệu bạn bổ sung trong luồng.
  • Kết hợp nhiều nền tảng trong một quy trình tự động hóa duy nhất (Kick + Twitch + YouTube được định tuyến qua một luồng).

Hãy nghĩ về popup như là "cài đặt trước nhanh" và Luồng Sự kiện như là bộ công cụ cho các quy trình làm việc tùy chỉnh.

Khởi chạy + Cơ bản

  • Mở trình chỉnh sửa Luồng Sự kiện từ menu của bảng điều khiển chính (máy tính để bàn hoặc tiện ích mở rộng).
  • Mọi dự án được lưu cục bộ cho đến khi xuất ra. Sử dụng Export để sao lưu hoặc chia sẻ.
  • Làm việc bên trong các khung vẽ gọi là flows (luồng). Mỗi luồng có thể đăng ký nhiều nền tảng cùng lúc.

Sơ lược về các Nút

  • Đầu vào (Inputs) (cổng bên trái) nhận ngữ cảnh tin nhắn.
  • Đầu ra (Outputs) (cổng bên phải) phát ra cùng ngữ cảnh đó cộng với bất kỳ chỉnh sửa nào.
  • Các nút logic có thể phát ra cả kênh true và một kênh false tùy chọn.

Cấu trúc Tải trọng (Payload)

Mỗi tin nhắn mang một đối tượng JSON. Các khóa bắt buộc tuân theo docs/event-reference.html (nền tảng, loại, tên chat, nội dung chat, v.v.). Đính kèm dữ liệu tùy chỉnh dưới meta.

Overlay Hành động Luồng (Đầu ra Hành động)

Các nút như Phát Đoạn Âm thanh, Hiển thị Overlay Phương tiện, và các điều khiển OBS cần một bề mặt hiển thị. Bề mặt đó là trang overlay Hành động Luồng được phục vụ từ actions.html. Hãy giữ nó chạy trong phần mềm phát sóng của bạn (OBS/Streamer.bot browser docks/v.v.) để các hành động Luồng Sự kiện có nơi để xuất hiện.

Cách mở nó (từ popup/bảng điều khiển):
  1. Mở popup chính của Chat All In One (cửa sổ tải từ popup.html hoặc biểu tượng tiện ích).
  2. Cuộn đến thẻ "Hành động Luồng" (Flow Actions). Sử dụng nút [sao chép liên kết] hoặc nhấp vào URL bên trong thẻ.
  3. Liên kết trông giống như https://chat.khanhhy.vn/actions.html?session=YOURSESSION. Dán nó vào OBS Browser Source (gợi ý 1920×1080) hoặc mở trong bất kỳ trình duyệt overlay nào.

Sau khi tải, overlay đó có thể:

  • Hiển thị phương tiện Tenor/GIPHY, văn bản, và pháo giấy được kích hoạt bởi các luồng của bạn.
  • Phát âm thanh (TTS, đoạn âm thanh) cục bộ để người xem nghe thấy.
  • Giao tiếp với OBS qua các cài đặt WebSocket nằm trong phần Hành động Luồng trong popup (chuyển cảnh, bật tắt nguồn, replay buffer, v.v.).
Giữ overlay mở. Đóng trang Hành động Luồng sẽ tạm dừng mọi hành động overlay/âm thanh/OBS trong Luồng Sự kiện. Hãy ẩn nó hoặc đặt trên một màn hình riêng thay vì đóng hẳn.

1. Cái gì Di chuyển Qua một Nút?

Thời gian chạy Luồng Sự kiện chuyển hai thứ qua mỗi dây:

  1. Tải trọng (Payload) – đối tượng dữ liệu sự kiện hoặc tin nhắn.
  2. Tín hiệu cổng (Gate signal) – một bit true/false báo cho nút tiếp theo biết có chạy hay không.
Nếu một nút xuất ra false: các nút phía sau sẽ dừng thực thi trừ khi chúng nhận đầu vào trên một nhánh riêng (ví dụ, ổ cắm false trên một nút Điều kiện). Điều đó giúp dễ dàng xây dựng logic dự phòng mà không cần nhân đôi toàn bộ luồng.

Kỳ vọng Đầu vào

  • Nguồn Sự kiện (Tin nhắn Twitch, Bộ đếm thời gian, Kích hoạt Thủ công, v.v.) bỏ qua đầu vào ngược dòng—chúng tạo ra tải trọng riêng và luôn phát true trừ khi chính nút đó bị lỗi.
  • Nút Biến đổi & Logic đọc tải trọng và có thể viết lại các trường, đặt trạng thái, hoặc lật tín hiệu cổng sang false.
  • Nút Hành động chỉ kích hoạt khi cổng vẫn là true. Chúng vẫn có thể xuất ra một tải trọng đã cập nhật nếu bạn muốn tiếp tục chuỗi hành động.

Mô hình Đầu ra

Đầu ra Đơn

Hầu hết các nút lộ ra một đầu ra. Bất cứ thứ gì đi vào (tải trọng + cổng) sẽ đi ra không đổi trừ khi nút chỉnh sửa nó.

Đầu ra True/False

Các nút Điều kiện, So sánh, Regex, và Logic phát ra hai cổng. True tiếp tục qua cổng xanh lá; false có sẵn trên cổng xám/đỏ.

Thông qua (Pass-Through) vs. Ghi đè (Override)

Một số nút (Đặt Biến, Toán học, Thay thế Văn bản) làm biến đổi tải trọng nhưng vẫn chuyển tiếp trạng thái true/false từ đầu vào của chúng. Các nút khác (NOT, AND, OR) tự tính toán lại giá trị boolean.

2. Bảng Tra cứu Nút Logic

Các khối này trả lời các câu hỏi phổ biến nhất về "True/false nghĩa là gì?".

NOT

  • Đầu vào: 1 boolean (true/false) lấy từ nút trước đó.
  • Đầu ra: boolean đảo ngược cộng với tải trọng nguyên vẹn.
  • Hành vi mặc định: Nếu không có gì kết nối đến đầu vào NOT, nó đánh giá là false, nên đầu ra là true.
Ví dụ: Đặt NOT sau "Chứa Từ khóa" để kích hoạt cảnh báo khi người xem không sử dụng từ khóa.

AND

  • Đầu vào: hai hoặc nhiều tín hiệu boolean (A, B, ...). Bạn có thể để trống các cổng thừa.
  • Đầu ra: true chỉ khi tất cả đầu vào được kết nối đều bằng true.
  • Sử dụng AND khi nhiều điều kiện phải được thỏa mãn đồng thời ("là người đăng ký" "tin nhắn chat chứa !raffle").

OR

  • Xuất ra true nếu bất kỳ đầu vào được kết nối nào là true.
  • Tuyệt vời cho các trình kích hoạt đa nền tảng: đưa các nút tin nhắn Twitch + YouTube vào một OR duy nhất, sau đó thống nhất hành động phía sau.
Tôi có luôn cần nút AND không?
Không. Nhiều nút đã cung cấp sẵn các bộ lọc tất cả trong một (ví dụ "Lọc Cấp độ Người dùng" + "Chứa Văn bản"). Sử dụng AND chỉ khi các tùy chọn tích hợp không bao gồm sự kết hợp của bạn, hoặc khi bạn muốn một điểm nối logic tái sử dụng mà các nhánh khác có thể chia sẻ.
NOT & đầu vào trống: Một nút NOT trôi nổi vẫn sẽ xuất ra true. Hãy nối nó với thứ gì đó có ý nghĩa hoặc vô hiệu hóa nút để nó không vô tình mở chặn một luồng.

3. Ví dụ Luồng Vi mô (Micro-Flows)

A. Tự động trả lời Trừ khi Tin nhắn là một Lệnh

Tin nhắn Twitch ──▶ Khớp Regex "^!" ─┐ │ ├─false──▶ Tự động Trả lời ("Cảm ơn đã chat!") │ └─true──▶ Không làm gì

Ở đây nút Regex phát ra true khi dòng tin một lệnh. Chúng ta định tuyến ổ cắm false đến câu trả lời của mình, vì vậy người chat thường nhận được sự ghi nhận trong khi các lệnh chỉ đơn giản đi qua.

B. Yêu cầu Nhiều Kiểm tra với AND

Tin nhắn YouTube ──▶ Chứa "!queue" ─▶ AND ─▶ Chuyển tiếp đến Discord Hội viên được Tặng ─▶ Vai trò Người dùng = Member ──▲

Nút AND đảm bảo chỉ các thành viên sử dụng đúng từ khóa mới chuyển tiếp đến Discord. Cả hai nhánh gửi kết quả boolean của chúng đến nút AND; tải trọng từ nhánh đầu tiên tiếp tục đi xuống.

C. Nút NOT để Chặn Cảnh báo Lặp lại

Tải trọng Sự kiện ─▶ Kiểm tra Trạng thái (isAlertMuted) └─false─▶ NOT ─▶ Phát Ăn mừng

Kiểm tra Trạng thái xuất ra true khi cảnh báo bị tắt tiếng. Bằng cách đảo ngược kết quả đó, nút NOT đảm bảo chúng ta chỉ phát ăn mừng khi cờ là false.

4. Ngăn chặn Tiếng Vọng, Vòng lặp và Phản hồi Chuyển tiếp

Chuyển tiếp (Relay) chat giữa các bề mặt rất mạnh mẽ nhưng có thể tạo tiếng vọng vô tận nếu bạn nghe đầu ra của chính mình. Hãy tuân thủ các biện pháp bảo vệ sau:

Bật "Không Phản chiếu" (No Reflections) trong Chuyển tiếp Chat.
Khi bạn sử dụng nút hành động Chuyển tiếp Chat, hãy bật bộ lọc Không Phản chiếu (đôi khi được dán nhãn là Không Tiếng Vọng). Cờ đó đánh dấu các tin nhắn gửi đi để bộ chuyển tiếp bỏ qua bất cứ thứ gì nó đã tiêm vào trước đó. Nếu không có nó, mỗi dòng được chuyển tiếp sẽ nhập lại vào luồng và kích hoạt các chuyển tiếp mới.
  • Gắn thẻ tin nhắn chuyển tiếp. Đặt meta.source = "relay" trước khi gửi, sau đó thêm một cổng "Bỏ qua nếu meta.source = relay" gần các nút nhập của bạn.
  • Sử dụng nút Debounce hoặc Cooldown cho các cảnh báo chỉ nên kích hoạt một lần mỗi X giây.
  • Cố ý phá vỡ vòng lặp. Nếu hai nhánh nuôi nhau, hãy thêm một nút logic kiểm tra biến trạng thái ("currentlyRelaying") để luồng thoát sớm khi cờ được đặt.

5. Đầu vào, Đầu ra, và Câu hỏi Thực tế

Cái gì đi vào một nút?

  • Toàn bộ tải trọng tin nhắn.
  • Bit cổng (true/false).
  • Ngữ cảnh tùy chọn (biến trạng thái, bộ đếm thời gian) mà nút yêu cầu cụ thể.

Cái gì rời khỏi một nút?

  • Tải trọng tương tự trừ khi nút chỉnh sửa nó.
  • Một bit cổng được tính toán lại (nút logic) hoặc bit thông qua (hành động).
  • Các tác dụng phụ (gửi chat, tặng điểm) xảy ra đồng thời nhưng không thay đổi tải trọng.

Khi nào nên rẽ nhánh?

Bất cứ khi nào bạn muốn phản ứng khác nhau với true so với false. Kéo một dây từ đầu ra có màu bạn cần (xanh lá = true, xám/đỏ = false) đến nút tiếp theo.

Hãy nhớ: Nếu bạn không làm gì với đầu ra false, luồng đơn giản kết thúc ở đó. Điều đó hoàn hảo cho các bộ lọc ("chặn mọi thứ không qua kiểm tra") nhưng đừng quên kết nối đường dẫn false nếu bạn cần dự phòng.

Hỏi & Đáp Thường gặp

  • Tôi có phải dùng AND cho mỗi cặp bộ lọc không? Không. Nhiều nút bao gồm nhiều kiểm tra (ví dụ, bộ lọc Tin nhắn cơ bản hỗ trợ từ khóa + vai trò). Sử dụng AND chỉ cho các kết hợp nâng cao hoặc khi hợp nhất tín hiệu từ các nút khác nhau.
  • Làm thế nào giá trị true/false đến được nút NOT? Bất kỳ nút nào có đầu ra xanh lá phát ra true theo mặc định. Khi một điều kiện thất bại, nó phát ra false. Kết nối dây đó vào NOT để đảo ngược kết quả.
  • Một nút có thể phát ra tải trọng ngay cả khi nó trả về false không? Có. Tải trọng vẫn di chuyển qua đầu ra false; tùy thuộc vào bạn quyết định nhánh đó sẽ đi đâu.

6. Danh sách kiểm tra Thực hành Tốt nhất

  • Đặt tên & tô màu các nút của bạn để bạn trong tương lai biết nhánh nào là nhánh nào.
  • Kiểm tra với trình mô phỏng tích hợp (Gửi Sự kiện Thử nghiệm) trước khi đẩy luồng trực tiếp.
  • Nhóm logic gần nguồn. Lọc càng sớm càng tốt để tránh xử lý thừa ở phía sau.
  • Lưu trữ các lần lặp lại trong nút Trạng thái. Sử dụng bộ đếm, công tắc bật tắt, và dấu thời gian để tránh cảnh báo kép.
  • Tài liệu hóa các trường meta. Khi bạn thêm các khóa meta tùy chỉnh, hãy ghi chú lại để overlay và máy khách từ xa giữ được tính nhất quán.
Lưu phiên bản. Xuất luồng của bạn bất cứ khi nào bạn đạt được một cột mốc. Nhập lại là cách quay lui dễ nhất nếu một thử nghiệm đi chệch hướng.

7. Khám phá Thêm

Sẵn sàng cho chiều sâu hơn?

  • Sử dụng Nút Trạng thái (bộ đếm, bật tắt, bộ đếm thời gian) để theo dõi ngữ cảnh giữa các sự kiện.
  • Kết hợp Biến + Logic để xây dựng hệ thống hàng đợi, xổ số, hoặc công cụ chấm điểm.
  • Móc nối vào hệ thống Điểm & Phần thưởng để người xem có thể cố ý kích hoạt luồng.

Hướng dẫn này được thiết kế độc lập—sao chép nó cục bộ, điều chỉnh cho nhóm của bạn, và tiếp tục thử nghiệm bên trong trình chỉnh sửa.