Nhật ký xưởng
Mỗi bản phát hành
một mũi chỉ
Hai phần: nhật ký làm dự án viết dài (tôi đã vấp ở đâu, sửa thế nào), và sổ thay đổi đầy đủ của 47 bản phát hành.
Nhật ký làm dự án
Đọc như một cuốn sổ
có cả chỗ làm sai
Sổ thay đổi
Đủ mọi bản
bấm một bản để mở
buildDISCORD11 thay đổi
Kinh tế
- Kinh tế. Một loại tiền ảo ("xu" theo mặc định; tên và emoji là phần cài đặt) được ghi trong sổ cái.
/vi(số dư, hạng, nghề, huy hiệu, xu hằng ngày, lịch sử),/lamviec(ca làm việc có thời gian chờ được lưu lại và năm nghề mở khóa theo tổng số xu đã kiếm),/cuahang(xem hàng; quản trị viên thêm, sửa và xóa món),/muahang(mua),/tuido(kho đồ, dùng vật phẩm),/tang(chuyển xu có thuế và giới hạn mỗi ngày),/doi(trao đổi với nút Chấp nhận và Từ chối),/danhcuoc(tung đồng xu, slot, blackjack) và/bangvang(người giàu nhất)./kinhtelà công cụ cho quản trị viên: cài đặt, cộng hoặc trừ xu kèm lý do ghi vào sổ cái, và lệnh đặt lại nằm sau một nút xác nhận. Lệnh mua là/muahangvì/muađã dùng để mua gói cho server. - Một đường an toàn duy nhất cho mọi thay đổi số dư.
eco_accountsvàeco_ledger; mọi thay đổi chạy trong một transactionBEGIN IMMEDIATE, không thể xuống dưới 0, ghi một dòng vào sổ cái và có thể mang mộtrefchống trùng lặp (idempotency). Mua hàng, chuyển xu, trao đổi và các ván cược đều là một transaction duy nhất. Chỉ dùng số nguyên. - Điểm danh.
/diemdanhgiờ cũng trả xu hằng ngày với cùng chuỗi ngày liên tiếp. Điểm, chuỗi và bảng xếp hạng riêng của nó không đổi, và không có dữ liệu cũ nào bị chuyển đổi hay thay đổi. - Cửa hàng. Phần thưởng vai trò (chỉ khi bot quản lý được vai trò đó, và hoàn tiền đầy đủ nếu việc cấp vai trò thất bại), vật phẩm tiêu hao (xp boost nhân đôi xp hoạt động trong một lúc, đồng xu may mắn hoàn lại một phần của lần cược thua kế tiếp) và huy hiệu, có giá, số lượng tồn kho tùy chọn và giới hạn cho mỗi người.
- Cờ bạc chỉ là ảo. Tắt cho đến khi quản trị viên bật lên. Có mức cược tối thiểu và tối đa, thời gian chờ, và tỷ lệ thật trong
/danhcuoc luat: tung đồng xu nhà cái giữ 5%, bảng slot trả lại 93,3% (tính từ chính bảng đó), blackjack trả 3:2 và nhà cái dừng ở 17. Không thể mua gì bằng tiền thật và không có gì quy đổi ra ngoài;/trogiupvà README đều nói rõ điều này. - Các gói. Free: 5 món trong cửa hàng và cược tối đa 200. Pro: 25 món, cược tối đa 5.000. Plus: 100 món, cược tối đa 50.000.
/trogiupđánh dấu các dạng lớn hơn là bị khóa trên server free. - Chống lạm dụng. Mỗi người chỉ có một hành động kinh tế tại một thời điểm, thời gian chờ được lưu trong cơ sở dữ liệu, đầu vào được kiểm tra hợp lệ và không có ping ở bất cứ đâu.
- Dashboard. Thêm tab "Kinh tế xu" với các cài đặt kinh tế.
- Job. Một job nền mới đóng các đề nghị trao đổi không ai trả lời và các ván blackjack không ai chơi xong.
- Dữ liệu. Các bảng mới
eco_accounts,eco_ledger,eco_items,eco_inventory,eco_tradesvàeco_games;/xoadulieuxóa chúng cùng với phần dữ liệu còn lại của server. Không thêm intent mới, không thêm dependency. - 958 test.
- Kinh tế. Một loại tiền ảo ("xu" theo mặc định; tên và emoji là phần cài đặt) được ghi trong sổ cái.
buildDISCORD12 thay đổi
Phòng voice tạm thời
- Phòng voice tạm thời.
/phongtambiến một kênh voice thành sảnh "vào để tạo phòng". Vào sảnh sẽ tạo một phòng đặt theo tên thành viên, với vài quyền chỉ trên đúng phòng đó (xem, vào, đổi tên, mời người ra), rồi chuyển họ vào. Phòng trống sẽ bị xóa, và một đợt quét dọn các phòng còn sót sau khi khởi động lại. 1 sảnh cho gói free, 3 cho Pro, 5 cho Plus. - Kênh thống kê.
/kenhthongkehiển thị số thành viên, boost, kênh hoặc vai trò ngay trong tên của một kênh voice, cập nhật mỗi 10 phút để nằm trong giới hạn đổi tên của Discord. Bot có thể dựng sẵn một kênh bị khóa cho việc này. 1 kênh cho gói free, 4 cho Pro và Plus. - Tin nhắn hẹn giờ.
/hengiođăng một tin nhắn mỗi ngày hoặc mỗi tuần vào giờ đã định và không bao giờ ping ai. 5 tin cho Pro, 15 cho Plus. - Nhắc việc cá nhân.
/nhacviecnhắc một thành viên bằng tin nhắn riêng sau một khoảng thời gian hoặc vào một giờ cụ thể. Mọi người đều dùng được, miễn phí. - Hộp góp ý.
/gopynhận góp ý từ bất kỳ ai, đăng kèm nút bình chọn, và cho phép staff duyệt, từ chối hoặc đánh dấu hoàn thành kèm ghi chú. Miễn phí. - Bộ lọc tài khoản mới.
/khoakhan caidat tuoitaikhoan hanhdongmoigắn cờ các tài khoản trẻ hơn số ngày đã chọn khi họ tham gia, và có thể kick họ. Miễn phí. - Từ cấm tùy chỉnh.
/automod tukhoa them, xoa, danhsach, xoahetghi các từ riêng của server vào quy tắc từ khóa gốc của Discord, nên bot vẫn không bao giờ đọc tin nhắn. 20 từ cho gói free, 200 cho Pro, 500 cho Plus. - Dashboard. Thêm các tab Giveaways, Role menus, Voice rooms (phòng tạm thời và kênh thống kê) và Suggestions, thẻ từ tùy chỉnh trong AutoMod, thẻ tuổi tài khoản trong Security, và các góp ý đang mở trên trang tổng quan.
- Trợ giúp.
/trogiupliệt kê các lệnh mới cùng cờ gói cho giới hạn của chúng. - Dữ liệu. Các bảng mới
temp_voice,scheduled_messages,reminders,suggestionsvàsuggestion_votes./xoadulieugiờ xóa chúng cùng với phần dữ liệu còn lại của server. Không thêm intent mới. - Website và sổ tay. Thẻ tính năng mới, danh sách lệnh, nội dung quyền riêng tư cho dữ liệu mới được lưu, và một mục mới trong sổ tay cho từng tính năng.
- 801 test.
- Phòng voice tạm thời.
buildDISCORD14 thay đổi
Thiết lập có hướng dẫn
- Thiết lập có hướng dẫn.
/batdaudựng và cấu hình một server từ ba menu và một nút, kèm điểm sức khỏe trước và sau cùng một thẻ để chia sẻ. Bot cũng đăng một nút Bắt đầu khi tham gia một server./trogiupliệt kê mọi lệnh theo nhóm và đánh dấu những gì bị gói khóa. - Bảo vệ. Anti-raid đếm lượt tham gia và cảnh báo, nâng mức xác minh hoặc khóa các kênh văn bản; mỗi lần khóa đều ghi lại những gì nó đã đổi, tự mở khóa sau một thời gian đã đặt và có thể gỡ sớm (
/khoakhan, hoặc nút trên cảnh báo). Anti-nuke guard (Pro) thu hồi các vai trò nguy hiểm của người xóa hàng loạt kênh hoặc vai trò trong thời gian ngắn. Mod log ghi lại các vụ ban, unban, timeout thực hiện qua bot, thay đổi quyền của vai trò và các lần AutoMod chặn, không bao giờ ghi nội dung bị chặn. - Kiểm duyệt.
/canhcao,/timeout,/kick,/bankiểm tra vị trí vai trò, nhắn tin cho thành viên, lưu một case có đánh số và ghi vào log./hosohiển thị mười case gần nhất của một thành viên. - Hoạt động. Xp khi chat và khi ở trong phòng voice, có thời gian chờ và giới hạn mỗi ngày,
/hangcho cấp độ và thứ hạng (Pro). Role menu bằng nút (/vaitro), giveaway (/quatang, Pro) và bình chọn ẩn danh (/binhchon). - Báo cáo. Bản tổng hợp số liệu hằng tuần và kiểm tra sức khỏe hằng tuần, cảnh báo khi điểm giảm mười điểm trở lên. Nhắc nhở ba ngày trước khi gói trả phí hết hạn và khi nó hết hạn.
- Trợ lý viết bằng AI.
/vietgiupsoạn nội quy, lời chào, thông báo hoặc phần giải thích về kiểm tra sức khỏe (Pro). - Dashboard có các tab bảo mật, điểm hoạt động, báo cáo hằng tuần và mod log, cùng một trang tổng quan mới. Một route JSON công khai
GET /statuscho trang trạng thái của website. - Giá. Pro $3.99 và Plus $7.99 mỗi 30 ngày, mua một năm chỉ tính mười tháng, và gói "Dựng giúp" một lần giá $4.99 tặng bảy ngày Pro. Gói free giờ được dựng hai lần.
/dungthuvẫn là một lần dùng thử 7 ngày cho mỗi server./muanhận 30, 90, 180 hoặc 365 ngày. - Phễu chuyển đổi.
/admin thongkehiển thị số server được mời, thiết lập xong, đã dựng, dùng thử và trả phí trong 30 ngày qua. - Các intent mới GuildVoiceStates, GuildModeration và AutoModerationExecution, không cái nào là privileged. Các bảng mới: events_log, xp, giveaways, giveaway_entries, polls, poll_votes, mod_cases và role_menus.
- Website. Thẻ tính năng mới, giá, danh sách lệnh đầy đủ, các mục FAQ, quyền riêng tư và điều khoản cho các tính năng mới, một trang cho mỗi theme với vai trò, danh mục và kênh của nó, và một trang trạng thái.
- Test end-to-end.
test/e2echứa một gateway giả (client, guild, thành viên, vai trò, kênh, interaction, đồng hồ có thể chèn vào) điều khiển bộ định tuyến lệnh, các module sự kiện và các job thật, với các luồng cho thiết lập, anti-raid, anti-nuke, hoạt động, giveaway và bình chọn, role menu, kiểm duyệt, ticket, thanh toán,/xoadulieu, tính hợp lệ của lệnh, định tuyến component và các quy tắc không dùng privileged intent. - Sửa lỗi.
/xoadulieuđể sót xp chưa được ghi và các cài đặt hoạt động đã cache trong bộ nhớ, nên một server đã bị xóa dữ liệu có thể bị ghi lại các dòng xp. - 586 test.
- Thiết lập có hướng dẫn.
buildDISCORD8 thay đổi
Luồng chào mừng với nút xác minh tùy chọn và vai trò khởi đầu
- Luồng chào mừng với nút xác minh tùy chọn và vai trò khởi đầu.
/chaomung. - Kiểm tra sức khỏe server với điểm số, giải thích và các cách sửa an toàn.
/khamsuckhoe. - AutoMod qua các quy tắc gốc của Discord, ba mức.
/automod. - Ticket dạng kênh riêng tư với cơ chế tự động đóng.
/ticket. - Web dashboard đăng nhập bằng Discord, chạy ngay bên trong bot.
- Thanh toán thẻ qua Stripe bên cạnh payOS.
/mua cach:stripe|payos; đơn Stripe được kiểm tra bằng cách polling, có xác minh mã đơn, số tiền và đơn vị tiền tệ. - Dùng thử:
/dungthucho một server bảy ngày Pro, một lần duy nhất. Lời chào của gói free có kèm một dòng ghi công nhỏ. - Server được mở khóa:
UNLOCKED_GUILD_IDScho các server được chọn mọi tính năng mà không cần license.
- Luồng chào mừng với nút xác minh tùy chọn và vai trò khởi đầu.
buildDISCORD10 thay đổi
Mức độ hài hước (nhẹ nhàng, troll, phi lý) cho mọi theme có sẵn và cho các theme đã…
- Mức độ hài hước (nhẹ nhàng, troll, phi lý) cho mọi theme có sẵn và cho các theme đã lưu, trong
/buildvà/theme dung. Mức độ này thay đổi câu chữ, không bao giờ đổi cấu trúc. - Theme đã lưu: lưu một blueprint từ trình chỉnh sửa, dùng lại, xuất ra và nhập vào.
/theme. - Sao lưu và khôi phục bố cục của server, với việc khôi phục chỉ tạo mới một cách an toàn và kiểm tra nghiêm ngặt khi nhập.
/backup. - Điểm danh, cấp độ, bảng xếp hạng và mini-game (đoán số, kéo búa bao, đố vui).
/diemdanh,/bangxephang,/doanso,/thachdau,/cauhoi. - Sự kiện định kỳ với sự kiện theo lịch của Discord và thông báo.
/sukien. - Thanh toán tự động qua payOS:
/muatạo một link thanh toán, một job polling các đơn đang mở và bật gói khi tiền về./admin donhangliệt kê các đơn gần đây. - Một bộ đăng ký job (
src/jobs.js) và một router cho phép mỗi lệnh tự quản lý các nút, menu, modal và autocomplete của mình. - Giới hạn gói cho các tính năng mới và
/goiđược cập nhật. - Sửa lỗi
/buildbị crash do một biến che mất module lines; các handler giờ được điều khiển trong test bằng interaction giả (128 test). - Website: một mục sau khi dựng xong, danh sách lệnh đầy đủ, các bước thanh toán, một trang quyền riêng tư liệt kê những gì các tính năng mới lưu, và deploy từ Git.
- Mức độ hài hước (nhẹ nhàng, troll, phi lý) cho mọi theme có sẵn và cho các theme đã lưu, trong
buildDISCORD5 thay đổi
Bảy theme mới, tổng cộng mười một
- Bảy theme mới, tổng cộng mười một: Booking Bạn Chơi (một server để đặt lịch chơi hoặc nói chuyện với một người bạn, có hướng dẫn đặt lịch, bảng giá, hồ sơ người chơi, khung giờ trống, phản hồi, các kênh chống lừa đảo và khiếu nại), fan anime, coder, người sáng tạo nội dung, điện ảnh và âm nhạc, đội văn phòng, và người yêu thú cưng.
- Các vai trò tin cậy trong theme booking (người chơi đã xác minh, người chơi nổi tiếng, khách quen) do staff cấp và không có trong bộ chọn tự gán.
- Test cho mọi tổ hợp tối đa bốn theme (561): giới hạn của Discord, không có khóa hay tên vai trò nào trùng giữa các theme, không có quyền nào trên các vai trò tự gán.
- Website hiển thị cả mười một theme, giới hạn một tổ hợp ở bốn theme như
/build, và gộp các theme ngay trên trình duyệt bằng bản port của phần gộp trong bot, được một test đối chiếu với bot cho mọi tổ hợp. - Sửa lỗi danh sách lệnh bị cuộn ngang trên điện thoại.
buildDISCORD6 thay đổi
Website tương tác
- Website tương tác: một bàn vẽ ở hero hiển thị kết quả thật của bot cho mọi tổ hợp theme, một bản thu nhỏ hoạt động được của trình chỉnh sửa blueprint, ba câu trả lời AI thật, thẻ các gói, lệnh có thể sao chép, một chữ thập vẽ kỹ thuật và một thước cuộn trang, theo phong cách blueprint sáng hơn. Reduced motion, cảm ứng và không có script đều có phương án thay thế đơn giản.
- Trang devlog hiển thị
docs/devlog.md, có mục lục, nút sao chép và thẻ hình minh họa. Bản thân devlog giờ là một bài viết kỹ thuật đầy đủ. - Dữ liệu của website lấy từ bot (
scripts/export-web-data.js,scripts/sample-designs.js) và có một test báo lỗi khi dữ liệu bị cũ. - Nhịp độ dựng có thể cấu hình (
BUILD_STEP_DELAY_MS) và bộ test giảm từ khoảng 38 giây xuống khoảng 2,5. - Một lần dựng thất bại giữa chừng giờ lưu lại những gì đã tạo, để
/nukecó thể dọn dẹp. - Một phản hồi 5xx từ Google được thử lại sau một khoảng nghỉ và báo là "không khả dụng" thay vì "không dùng được".
buildDISCORD2 thay đổi
Website chính thức hoạt động tại builddiscord.vercel.app, với giá các gói bằng đô la Mỹ…
- Website chính thức hoạt động tại builddiscord.vercel.app, với giá các gói bằng đô la Mỹ ($9.99 và $19.99 mỗi 30 ngày), liên kết liên hệ qua Instagram và website, và một quy định hoàn tiền trong điều khoản.
- Website hoàn thiện: các mục về nhà thiết kế AI (kèm một câu trả lời mẫu thật) và blueprint có thể chỉnh sửa, một mục các gói kèm cách mua mã, cả bảy lệnh dành cho khách hàng, FAQ được cập nhật, một trang devlog bằng cả hai ngôn ngữ, và một nút mời bot hoạt động được.
buildDISCORD7 thay đổi
/build với một đến bốn theme trộn lại (game thủ đêm khuya, học mà như không học, cộng…
/buildvới một đến bốn theme trộn lại (game thủ đêm khuya, học mà như không học, cộng đồng tạp hóa, chill cùng hội), một blueprint có thể chỉnh sửa (xóa hoặc đổi tên một danh mục, thêm một kênh) và một bước xác nhận trước khi tạo bất cứ thứ gì./thietke: một server do Google Gemini thiết kế từ một mô tả ngắn, với ba mức độ hài hước. Câu trả lời được làm sạch và luôn được hiển thị trước dưới dạng blueprint có thể chỉnh sửa./nuke,/roast,/goi,/kichhoat,/xoadulieuvà/adminchỉ dành cho chủ bot.- Các gói theo từng server (free, Pro, Plus) được kích hoạt bằng mã dùng một lần;
npm run licensetạo và liệt kê mã. - Lưu trữ SQLite với việc tự động nhập các file JSON của phiên bản đầu tiên, và một bản sao cơ sở dữ liệu mỗi ngày.
- Health check, cảnh báo lỗi gửi đến một webhook, và một trình cài đặt cho Raspberry Pi với cơ chế tự cập nhật hằng ngày, tự rollback khi phiên bản mới không khỏe.
- Một landing page song ngữ (Next.js) với các trang quyền riêng tư và điều khoản.
companionsDISCORD3 thay đổi
Nhắc tên một bot trong kênh companions rồi hỏi giờ ("mấy giờ rồi?", "what time is it in…
- Nhắc tên một bot trong kênh companions rồi hỏi giờ ("mấy giờ rồi?", "what time is it in Tokyo?"), ngày tháng, hoặc thời tiết và nhiệt độ ("thời tiết hôm nay", "weather in Hanoi tomorrow"): bot sẽ trả lời bằng dữ liệu trực tiếp. Giờ và ngày không cần mạng và theo múi giờ của các bot hoặc thành phố được nhắc tới; thời tiết lấy từ Open-Meteo (miễn phí, không cần key), nơi này chỉ nhận một tên địa điểm, không bao giờ nhận tin nhắn. Tính năng này chạy được mà không cần AI; khi bật trả lời bằng AI, bot sẽ diễn đạt lại các thông tin đó theo cá tính riêng. Nhiệt độ hiển thị bằng °F và °C.
COMPANION_LOCATIONđặt thành phố nhà cho chữ "ở đây" (mặc định Los Angeles) vàLOOKUPS=offtắt tính năng này. - Trả lời bằng AI giờ biết ngày và giờ hiện tại. Tùy chọn
AI_SEARCH=oncho phép Gemini dùng Google Search để trả lời các câu hỏi về tin tức, giá cả và kết quả (đây là tính năng trả phí của Gemini; nếu bị từ chối, bot sẽ quay về cách trả lời bình thường). - Giới hạn số câu trả lời AI mỗi ngày giờ được đặt lại vào nửa đêm theo múi giờ của các bot thay vì UTC.
- Nhắc tên một bot trong kênh companions rồi hỏi giờ ("mấy giờ rồi?", "what time is it in Tokyo?"), ngày tháng, hoặc thời tiết và nhiệt độ ("thời tiết hôm nay", "weather in Hanoi tomorrow"): bot sẽ trả lời bằng dữ liệu trực tiếp. Giờ và ngày không cần mạng và theo múi giờ của các bot hoặc thành phố được nhắc tới; thời tiết lấy từ Open-Meteo (miễn phí, không cần key), nơi này chỉ nhận một tên địa điểm, không bao giờ nhận tin nhắn. Tính năng này chạy được mà không cần AI; khi bật trả lời bằng AI, bot sẽ diễn đạt lại các thông tin đó theo cá tính riêng. Nhiệt độ hiển thị bằng °F và °C.
companionsDISCORD1 thay đổi
Các bot được gọi bằng tên Discord của chúng, đọc trực tiếp khi chương trình đang chạy…
- Các bot được gọi bằng tên Discord của chúng, đọc trực tiếp khi chương trình đang chạy (Developer Portal, tên application), nên đổi tên một bot không cần sửa gì trong code. Các cá tính giữ tên gọi khi làm việc (Pip, Chamy...) chỉ bên trong các file. Một câu có nhắc tên bot, dù bot tự nhắc tên mình ("Maple gives up") hay nhắc một bot khác ("Chamy teased me"), đều hiển thị tên Discord hiện tại; các cảnh tám chuyện, bảng tâm trạng, các ghi chú dưới tên và các câu trả lời của Gemini cũng làm như vậy. Chỉ những tên thật sự xuất hiện trong câu mới được thay, và thay theo nguyên từ, nên các từ bình thường như dog hay cow không bao giờ bị đụng tới.
companionsDISCORD5 thay đổi
Mỗi bot có một tâm trạng cho cả ngày (vui, cáu kỉnh, buồn ngủ, phấn khích, mơ màng,…
- Mỗi bot có một tâm trạng cho cả ngày (vui, cáu kỉnh, buồn ngủ, phấn khích, mơ màng, lười), được tính từ ngày và số thứ tự của bot, nên cả ngày không đổi và vẫn giữ nguyên sau khi khởi động lại; Grumble nghiêng về cáu kỉnh, Pip và Rocket nghiêng về vui vẻ. Cứ sáu ghi chú trạng thái thì có một cái hiện tâm trạng (184 ghi chú mới), và
/tamtranghiện tâm trạng của tất cả mọi người. /companions chaohoi enabled: mỗi ngày hai hoặc ba bot chào buổi sáng (khi giờ yên lặng kết thúc) và chúc ngủ ngon (một giờ trước khi giờ yên lặng bắt đầu) thành một chuỗi nhỏ các câu trả lời theo thread, bot đầu tiên nói theo tâm trạng của nó trong ngày. Thời điểm được cố định theo từng server và từng ngày, 312 câu mới./companions reactions enabled: thỉnh thoảng một bot thả một reaction ấm áp vào tin nhắn của một thành viên trong kênh chat (tối đa một lần trong khoảng tám tin nhắn, hai phút một lần). Cần quyền Add Reactions; owner vẫn nhận các reaction ngại ngùng./lamsong [emoji]: một đợt sóng emoji kiểu sân vận động chạy qua tối đa chín bot, kèm một tiếng hô của bot đứng giữa (và tên người chơi nếu có nhập)./sinhnhat set,removevàlistcùng/companions sinhnhat enabled: một thành viên lưu sinh nhật của mình (ngày và tháng, không bao giờ có năm); đến ngày đó sáu đến tám bot hát trong kênh chat, bot đầu tiên ping người đó, từ 9:00 và ngoài giờ yên lặng. Ngày 29 tháng 2 được tổ chức vào ngày 28 ở năm không có ngày 29. Ngày sinh được xóa bằng/sinhnhat removehoặc cùng với phần dữ liệu còn lại của server.birthdays.jsonlà file thứ tư chứa user id, và trang quyền riêng tư có nói rõ điều đó.
- Mỗi bot có một tâm trạng cho cả ngày (vui, cáu kỉnh, buồn ngủ, phấn khích, mơ màng, lười), được tính từ ngày và số thứ tự của bot, nên cả ngày không đổi và vẫn giữ nguyên sau khi khởi động lại; Grumble nghiêng về cáu kỉnh, Pip và Rocket nghiêng về vui vẻ. Cứ sáu ghi chú trạng thái thì có một cái hiện tâm trạng (184 ghi chú mới), và
companionsDISCORD1 thay đổi
Hơn một nghìn câu mới cho /khen, /hype và phần cổ vũ khi Go Live, vừa hài hước vừa tình…
- Hơn một nghìn câu mới cho
/khen,/hypevà phần cổ vũ khi Go Live, vừa hài hước vừa tình cảm: hype kỹ năng, bản tin giả và kỷ lục thế giới, những câu dịu dàng và tự hào ("uống miếng nước đi, tụi em tự hào về anh"), những phép so sánh đời thường phi lý, đe dọa và mặc cả kịch tính, khoảng một trăm câu fangirl ngọt ngào dành cho các bạn nữ, những câu có tên người chơi, những câu theo giọng của hai bạn nam (Lai Bâng cưng chiều, Trường Giang làm người dẫn chương trình) và khoảng 250 câu tiếng Anh. Các bot giờ chọn từ khoảng năm trăm câu tiếng Việt cho mỗi bạn nữ thay vì ba mươi tám, nên một buổi/hypedài sẽ rất lâu mới bị lặp lại. Các bài test kiểm tra rằng không có câu nào xuất hiện hai lần, kể cả trong các kho câu của/che,/clutchvà/fail.
- Hơn một nghìn câu mới cho
companionsDISCORD6 thay đổi
/tamchuyen [chude] và /companions tamchuyen enabled
/tamchuyen [chude]và/companions tamchuyen enabled: các companion trò chuyện với nhau như bạn bè trong một group chat. 56 cảnh bằng cả hai ngôn ngữ (chủ đề chung cho mọi bot nữ, mạng lưới quan hệ của các bot 22 đến 27, sự va chạm giữa các cá tính cũ hơn, và các cảnh về owner). Mỗi cảnh có 3 đến 5 bot, 6 đến 10 câu, các câu trả lời theo thread thật sự, những quãng nghỉ như người thật, và các bot gọi tên và trêu nhau. Các bạn nam chỉ xuất hiện trong những cảnh viết riêng cho họ. Mỗi server nhớ 60 cảnh gần nhất đã thấy và không lặp lại cảnh nào cho đến khi đã thấy hết phần còn lại. Tự động, các group chat bắt đầu 1, 2 hoặc 4 lần một ngày (êm, bình thường, sôi nổi) trong khoảng 10:00 đến 22:00, ngoài giờ yên lặng, cách nhau ít nhất 90 phút và vào một thời điểm ngẫu nhiên./dudoan startvà/dudoan result: các thành viên cược bằng nút Thắng hoặc Thua cho ván tiếp theo của người chơi, một số companion cược thành tiếng, số lượng cược cập nhật trực tiếp, và kết quả liệt kê ai đoán đúng (chỉ tên) trong khi các lượt cược nhận reaction. Chỉ lưu trong bộ nhớ./companions autohype enabled: khi ai đó bắt đầu một buổi Go Live trong voice, các companion tự cổ vũ trong kênh chat cho đến khi buổi stream kết thúc (tối đa một giờ, không bao giờ trong giờ yên lặng).- Reaction ngại ngùng: khi các bot có quyền Add Reactions (các link mời giờ đã xin quyền này), thỉnh thoảng một bot thả reaction vào tin nhắn của owner trong kênh chat rồi rút lại sau vài giây. Không có quyền thì không có gì xảy ra.
- Khoảng một trong ba ghi chú dưới tên bot giờ theo thời gian trong ngày (sáng, trưa, chiều, tối, đêm, khuya và cuối tuần), và các ghi chú của chín bot đầu tiên đã được viết lại để nghe như người thật.
- Múi giờ của các bot trên Raspberry Pi giờ là giờ Việt Nam (
COMPANION_TIMEZONE=Asia/Ho_Chi_Minh), nên giờ yên lặng, cảnh buổi tối và bản tổng kết thứ Hai đều theo giờ Việt Nam.
companionsDISCORD8 thay đổi
Ghi chú dưới tên bot không còn nói "Sitting in voice with N people" (mọi bot đều hiện…
- Ghi chú dưới tên bot không còn nói "Sitting in voice with N people" (mọi bot đều hiện cùng một câu mỗi khi có ai đó trong phòng). Giờ các bot luôn hiện những ghi chú hài hước của riêng mình, cứ 15 phút đổi một cái mới; chỉ khi có một phiên focus đang chạy (hoặc biển hiệu camera) thì mới thay thế chúng.
/clutch(mọi companion phát cuồng vì một pha clutch) và/fail(an ủi, kèm chút trêu, sau một pha fail): cùng các tùy chọn như/khen, với các câu riêng ở cả hai ngôn ngữ./hype start [minutes] [mood]và/hype stop: các companion tự cổ vũ liên tục trong 5 đến 60 phút (mặc định 15), cứ 20 đến 45 giây một bot, với lời khen, lời trêu hoặc trộn cả hai. Mỗi kênh một phiên, tối đa 60 tin nhắn./tranhluan a b: các companion chia thành hai phe và tranh luận vui về a hoặc b, rồi một bot đưa ra phán quyết./drama [couple]và/companions drama enabled: những cảnh ngắn giữa Lai Bâng và Six, Trường Giang và Nhã Phương, furyZ và Chamy, theo yêu cầu hoặc mỗi tối một lần (từ 19:00 trở đi, ngoài giờ yên lặng)./khen-top: những cái tên được khen nhiều nhất và bị trêu nhiều nhất trong tuần. Chỉ lưu tên (không bao giờ lưu ID), chỉ cho tuần hiện tại, trongpraise.json, và chúng bị xóa cùng với phần dữ liệu còn lại của server.OWNER_IDScó thể kèm mức độ ngại ngùng cho từng owner (id:1,id:2,id:3). Mức 2, mặc định, làm dịu lời tạm biệt sau 45 phút trong phòng voice; mức 3 dịu ngay từ đầu; mức 1 không bao giờ dịu. Những câu dịu đó vẫn nửa chối nửa nhận.- Các lệnh mới dùng chung khoảng chờ 20 giây mỗi kênh với
/khen.
companionsDISCORD3 thay đổi
/khen và /che có thêm tùy chọn nguoi để chọn người chơi từ server
/khenvà/checó thêm tùy chọnnguoiđể chọn người chơi từ server: các bot sẽ nói tên của thành viên đó. Gõ một @mention vàotencũng được đổi thành tên thành viên; trước đây chỉ còn lại ID dạng số.
/che: cùng các tùy chọn như/khen, nhưng thay vào đó mỗi companion trêu người chơi một chút (kiểu roast thân thiện về lối chơi, không bao giờ về ngoại hình hay bất cứ điều gì cá nhân). Một kênh dùng được/khenhoặc/chemỗi 20 giây một lần.OWNER_IDStrong.env(các Discord user ID cách nhau bằng dấu phẩy): với một owner, các companion tỏ ra ngại ngùng. Chúng giả vờ không quan tâm mà thầm thích, trong lời chào mừng, lời chào trong voice, lời tạm biệt và lời nhắc (khoảng 85 phần trăm số lần, để không bao giờ thành kịch bản) và, khi bật Gemini, cả trong các câu trả lời. Những người khác nhận các câu ấm áp bình thường, và các câu trả lời của Gemini được dặn là phải tỏ ra vui mừng. Các bạn nữ xưng em, hai bạn nam xưng tui. Khi danh sách trống thì không có gì thay đổi.
companionsDISCORD1 thay đổi
/khen
/khen: mọi companion cổ vũ người chơi trong kênh nơi gõ lệnh, mỗi bot một câu khác nhau, cách nhau vài giây ("anh hay quá", "anh giỏi quá" và nhiều câu khác). Tùy chọn:goi(anh, chị hoặc bạn),ten(một cái tên để nói) vàlanguage(mặc định Tiếng Việt, hoặc English). Các bạn nữ tự xưng em và hai bạn nam xưng tui; dùng được ở bất kỳ kênh nào các bot có thể viết, dù chúng đang ngồi ở voice nào. Mỗi kênh 20 giây một lần.
companionsDISCORD5 thay đổi
Bốn cá tính mới cho các bot 24 đến 27, thay thế Sizzle, Gizmo, Anchor và Jinx: Lai…
- Bốn cá tính mới cho các bot 24 đến 27, thay thế Sizzle, Gizmo, Anchor và Jinx: Lai Bâng, Six, Trường Giang và Nhã Phương, mỗi người có câu thoại riêng và 25 ghi chú ở cả hai ngôn ngữ. Lai Bâng và Six là một cặp; Trường Giang mê mệt Nhã Phương, người thì khó chịu một cách hài hước vì anh ấy.
- Giới tính đã chốt: mọi bot đều là con gái trừ Lai Bâng và Trường Giang. furyZ và Chamy không còn là một cặp mà là bạn thân thiết nhất, và các ghi chú của họ đã được viết lại cho khớp.
- Các câu dùng chung cho mọi bot (lời chào mừng, tạm biệt, lời nhắc, các bước Pomodoro) không còn dùng cách xưng hô theo giới như sir, he hay she, mà nói "bạn" hoặc "mọi người" thay vì đoán xem ai đang nghe.
- README, bảng dàn nhân vật và danh sách trên website đều liệt kê đủ 30 cá tính.
/assemblevà/randomnhanh hơn nhiều với 30 bot: chúng bắt đầu ngay thay vì chờ vòng 15 giây kế tiếp, và các bot kết nối sáu bot một lúc thay vì lần lượt từng bot (bot đầu tiên của một phòng vẫn đi một mình, để kênh join-to-create được nhận biết trước). Một đám đông giờ đến nơi trong chưa đầy một phút, và các vòng voice không còn chồng lên nhau được nữa.
companionsDISCORD2 thay đổi
Devlog (website ở cả hai ngôn ngữ, và docs/devlog.md) được viết lại với phần triển khai…
- Devlog (website ở cả hai ngôn ngữ, và
docs/devlog.md) được viết lại với phần triển khai trên Raspberry Pi 5, những khó khăn và cách giải quyết, các bổ sung về sau và một phần bài học rút ra. /assemble [bots]gọi các companion tới kênh voice mà bạn đang ở, và/random [bots]gửi chúng tới các kênh voice ngẫu nhiên mà chúng có thể kết nối. Cả hai đều thay thế các phòng voice đã lưu (các bot ở lại nơi chúng được gửi tới), làm trống các phòng cũ, mặc định cần quyền Move Members và bị giới hạn một lần mỗi phút cho mỗi server. Có test cho cả hai.
- Devlog (website ở cả hai ngôn ngữ, và
companionsDISCORD1 thay đổi
Các tính năng Gemini tùy chọn, mặc định tắt và chỉ hoạt động khi đã đặt GEMINI_API_KEY:…
- Các tính năng Gemini tùy chọn, mặc định tắt và chỉ hoạt động khi đã đặt
GEMINI_API_KEY:/companions ai replies(một companion trả lời, theo cá tính riêng và vẫn với tư cách một bot, khi có ai nhắc tên hoặc trả lời nó trong kênh companions) và/companions ai daily(một câu đố có đáp án ẩn, một câu hỏi hoặc một câu would-you-rather được viết mỗi ngày một lần). Cooldown theo từng thành viên, giới hạn mỗi ngày và giới hạn mỗi phút giữ cho nó lịch sự, đầu ra của model được làm sạch (không có mention, không có link), và không có gì về thành viên được gửi đi ngoài nội dung tin nhắn. README, docs, trang quyền riêng tư và website đều nói thẳng rằng chế độ này gửi đúng một tin nhắn đó tới Google.
- Các tính năng Gemini tùy chọn, mặc định tắt và chỉ hoạt động khi đã đặt
companionsDISCORD1 thay đổi
/companions voice camera enabled
/companions voice camera enabled: các companion đang ngồi trong phòng voice hiện biển "camera on" dưới tên và một bot thông báo điều đó trong chat. Đó chỉ là một biển hiệu, bot không thể gửi video thật. Có các câu tiếng Anh và tiếng Việt, một bài test, và phần voice của website đã được cập nhật.
companionsDISCORD2 thay đổi
Một trang devlog trên website ở cả hai ngôn ngữ, và một devlog dài hơn trong docs.
- Một trang devlog trên website ở cả hai ngôn ngữ, và một devlog dài hơn trong docs.
- Cách diễn đạt và các con số được chỉnh cho khớp với 30 bot; dự án được đánh dấu là đã hoàn thành.
companionsDISCORD2 thay đổi
Mỗi cá tính nói bằng câu riêng của mình khi chào mừng một thành viên mới, chào hoặc tạm…
- Mỗi cá tính nói bằng câu riêng của mình khi chào mừng một thành viên mới, chào hoặc tạm biệt ai đó trong phòng voice, và đưa ra một lời nhắc: 20 câu cho mỗi mục đích ở mỗi ngôn ngữ, cho từng cá tính trong 30 cá tính. Bot lên tiếng là một trong những bot đang ngồi trong phòng.
- Thêm khoảng 960 câu hỏi trivia cho mỗi ngôn ngữ (địa lý, động vật, thiên nhiên, vũ trụ, cơ thể, khoa học, lịch sử, phát minh, máy tính và game, phim, nhạc và nghệ thuật, ẩm thực, thể thao, ngôn ngữ, toán, Việt Nam, thần thoại, kiến thức đời thường), mỗi câu đều được một người đọc thứ hai kiểm tra. Trivia giờ có khoảng 1.250 câu hỏi cho mỗi ngôn ngữ.
companionsDISCORD2 thay đổi
Khoảng 1.000 câu nói cho mỗi ngôn ngữ ở mỗi mục đích: chào mừng, chào trong voice, tạm…
- Khoảng 1.000 câu nói cho mỗi ngôn ngữ ở mỗi mục đích: chào mừng, chào trong voice, tạm biệt trong voice (mới: khi người ở lại từ 20 phút trở lên rời đi), lời nhắc, và mỗi loại 500 câu cho các bước bắt đầu, nghỉ, làm việc và xong của một phiên focus.
- furyZ (game thủ Valorant) và Chamy (bạn thân thiết nhất của cô ấy) cho các bot 22 và 23, cùng các ghi chú phù hợp về tình bạn của họ.
companionsDISCORD3 thay đổi
Tối đa 30 bot thay vì 10
- Tối đa 30 bot thay vì 10. 21 cá tính mới (Rex, Maple, Rocket, Zip, Clue, Mochi, Waffle, Tofu, Ziggy, Echo, Misty, Byte, furyZ, Chamy, Sizzle, Gizmo, Anchor, Jinx, Quill, Blip, Sparky), mỗi cá tính có câu thoại riêng và 25 ghi chú ở cả hai ngôn ngữ.
- Đăng nhập vài bot một lúc, và cache nhẹ hơn cho mỗi bot, nên 30 bot vẫn gọn nhẹ.
- Mỗi companion có một ghi chú hài hước dưới tên ngay từ lúc khởi động.
companionsDISCORD8 thay đổi
Mỗi companion hiện một ghi chú dưới tên ngay từ lúc khởi động
- Mỗi companion hiện một ghi chú dưới tên ngay từ lúc khởi động: 25 ghi chú hài hước cho mỗi cá tính ở cả hai ngôn ngữ, đổi mỗi 15 phút; người trong phòng voice và các phiên focus sẽ thay thế khi chúng xảy ra.
- Các gói theo mùa: Halloween, Giáng sinh, Năm mới, Tết, Valentine, bằng tiếng Anh và tiếng Việt.
- Bản tổng kết hằng tuần vào sáng thứ Hai, chuỗi thắng trivia kèm lời chúc mừng ở các mốc, thông báo thành viên voice thường xuyên.
- Tinh chỉnh thích ứng các loại cuộc trò chuyện cho từng server, và giờ tốt nhất trong
/companions stats. - Cảnh báo webhook tùy chọn và sao lưu hằng ngày các file dữ liệu.
- Xuất và xóa dữ liệu theo từng server, tự động dọn dẹp một ngày sau khi mọi companion đã rời một server.
- Các tick không bao giờ chồng lên nhau; có một bài test cho 300 server.
- CI, một image đa kiến trúc trên GitHub Container Registry, các issue template.
companionsDISCORD4 thay đổi
Các companion ngồi trong phòng voice 24/7
- Các companion ngồi trong phòng voice 24/7: nhiều phòng, bot giữ phòng của mình, kênh "join to create", không có icon mute.
- Phiên focus Pomodoro, lời chào trong voice, bảng thời gian voice.
- Tin nhắn chào mừng kèm câu phá băng, lời nhắc và đếm ngược sự kiện.
- Endpoint trạng thái tùy chọn, ghi chú kiến trúc, website song ngữ phong cách điện ảnh.
companionsDISCORD2 thay đổi
Câu hỏi trong ngày, poll, trivia với các nút đáp án và bảng xếp hạng hằng tuần.
- Câu hỏi trong ngày, poll, trivia với các nút đáp án và bảng xếp hạng hằng tuần.
/companions stats, nội dung tùy chỉnh, chín cá tính, khoảng 1.250 fun fact cho mỗi ngôn ngữ.
companionsDISCORD1 thay đổi
Từ hai đến mười bot nhỏ trò chuyện, đùa giỡn và chia sẻ những điều thú vị, và lùi lại…
- Từ hai đến mười bot nhỏ trò chuyện, đùa giỡn và chia sẻ những điều thú vị, và lùi lại khi mọi người đang nói chuyện.
aimDISCORD13 thay đổi
Tab Home, thứ đầu tiên người chơi nhìn thấy
- Tab Home, thứ đầu tiên người chơi nhìn thấy: một dòng giới thiệu app là gì, một nút Play now thật lớn (chế độ chơi gần nhất, lần đầu là Gridshot), và ba thẻ: Peek, thử thách hôm nay kèm đồng hồ đếm ngược, và quiz. Bài khởi động 5 phút và danh sách đầy đủ các chế độ chỉ cách một cú nhấp; các trận duel đang mở hiện thành một dải ở trên cùng. Danh sách chế độ, thẻ rank và bảng của phòng chuyển sang tab Modes.
- Quiz giờ khó đến mức gần như không thể, và câu nào cũng có đồng hồ: · Tiny corner: một phần sáu của ảnh chụp trong map, đoán tên map trong số mười hai map. · Where is this?: nguyên một ảnh chụp trong map, nhấp vào đúng chỗ trên minimap. · Callouts: chỉ có tên callout (chỉ kèm site khi tên đó dễ nhầm); điểm tối đa nếu lệch không quá 1.5% minimap. · Whose ability: chỉ có icon, giữa tám agent, phần lớn cùng một vai trò. · Gun stats: một con số chính xác (sát thương vào đầu, thân hoặc chân ở một tầm nhất định, tốc độ bắn, thời gian nạp đạn, thời gian rút súng, băng đạn, giá) giữa bốn con số sát nhau. Ảnh chụp trong map (357 ảnh, mỗi callout một ảnh, 12 map) lấy từ wiki Valorant qua server, được liệt kê trong
src/data/mapshots.jsonbởiscripts/build-mapshots.js; ảnh không được lưu trong repo. - Valorant của bạn: khi có API key HenrikDev (
HENRIKDEV_KEY), tab Career hiện tài khoản thật của người chơi: thẻ, cấp, rank hiện tại kèm RR và lần thay đổi gần nhất, rank cao nhất, và năm trận gần nhất (agent, map, K/D/A, % headshot, điểm), kèm link tới tracker.gg. Riot ID lấy từ tài khoản Riot đã liên kết trên Discord (Activity giờ xin quyền connections, và vẫn đăng nhập được nếu bị từ chối) hoặc tự gõ vào. Home hiện rank thật bên cạnh rank kiếm được ở đây. - Lần đầu vào, app hỏi độ nhạy Valorant của người chơi; app dùng đúng thang của game nên con số được giữ nguyên.
- Khởi động 5 phút: Gridshot, Peek, Tracking và Microshot chơi liền nhau, mỗi ván được tính như bình thường, rồi một bảng tổng kết kèm lượng RR mỗi chế độ thay đổi.
- Âm thanh: một tiếng ngân trong trẻo mỗi lần bắn trúng, một tiếng chuông đầy hơn ở mỗi lần trúng thứ năm liên tiếp và mỗi mục tiêu Switching bị phá, và một tiếng bịch đục khi bắn vào vật che trong Peek. Tất cả đều được tổng hợp; không dùng âm thanh của game.
- Chia sẻ lên kênh: màn kết quả có thể đăng một thẻ kết quả (chế độ, điểm, độ chính xác, số lần trúng, rank) vào kênh nơi ván được chơi, một lần cho mỗi ván.
- Gỡ bỏ: hình map trên bức tường sau của trường bắn từ bản 0.11.0; đó là hình của cả map, không phải một chỗ trong map.
aimDISCORD4 thay đổi
Chế độ rank mới, Peek (Giữ góc)
- Chế độ rank mới, Peek (Giữ góc): đầu ló ra từ sau vật che (một thùng gỗ, hai cột khung cửa, một chồng thùng và một mép tường), giữ từ 0.45 đến 0.9 giây rồi rút vào, không bao giờ ló ra ở cùng một góc hai lần liền. Bắn vào vật che là trượt dù sát ngay cạnh đầu; một phát trúng được 60 đến 200 điểm, trúng càng sớm càng nhiều, nhân với độ chính xác. Các vạch mờ trên vật che đánh dấu các góc ở độ cao đầu. Luật chơi dùng chung với phần phát lại của server như mọi chế độ khác, và
/bxh,/thachdauvà/hosođều có chế độ này (thẻ hồ sơ giờ xếp bốn ô mỗi hàng). - Phông nền trường bắn: bức tường sau của căn phòng 3D có thể hiện hình một map thi đấu của Valorant, được làm tối để mục tiêu và vật che nổi bật, chọn ngẫu nhiên hoặc chọn trong Settings (hoặc tắt đi). Tên map nằm cạnh tên chế độ ở góc màn hình. Đây là một texture vẽ một lần, nên tốc độ khung hình không đổi.
- Tab Quiz với bốn trò, mỗi trò mười câu, không tính rank, điểm cao nhất lưu trên thiết bị: Callouts (nhấp vào chỗ của một callout trên minimap thật, chấm điểm theo khoảng cách, rồi xem vị trí đúng và các callout gần đó), Name the map (một góc cận cảnh hình của map), Whose ability (icon và mô tả của một kỹ năng, giấu tên, chọn trong bốn agent) và Which gun (hai khẩu súng và một câu hỏi về chỉ số của chúng). Trả lời đúng liên tiếp được thưởng thêm. Phím số dùng để chọn đáp án.
- API chuyển tiếp dữ liệu map (kèm vị trí callout trên minimap), agent (vai trò và kỹ năng), chỉ số vũ khí, và hình ảnh của chúng; hình map được thu nhỏ còn WebP 1280 px trên server, và chỉ những byte PNG, JPEG hoặc WebP thật mới được giải mã.
- Chế độ rank mới, Peek (Giữ góc): đầu ló ra từ sau vật che (một thùng gỗ, hai cột khung cửa, một chồng thùng và một mép tường), giữ từ 0.45 đến 0.9 giây rồi rút vào, không bao giờ ló ra ở cùng một góc hai lần liền. Bắn vào vật che là trượt dù sát ngay cạnh đầu; một phát trúng được 60 đến 200 điểm, trúng càng sớm càng nhiều, nhân với độ chính xác. Các vạch mờ trên vật che đánh dấu các góc ở độ cao đầu. Luật chơi dùng chung với phần phát lại của server như mọi chế độ khác, và
aimDISCORD8 thay đổi
Giao diện mới, "Tactical"
- Giao diện mới, "Tactical": game được khoác áo một client FPS. Các panel màu xám xanh navy có góc cắt và khung ngắm, Chakra Petch (hỗ trợ tiếng Việt) viết hoa giãn chữ cho tiêu đề, tên và nút, một màu nhấn xanh mòng két duy nhất, một lớp scanline mờ. Giao diện tạp chí thời trang và Playfair Display không còn nữa.
- Màn kết quả là một bản báo cáo sau trận nền tối thay vì trang giấy kem; căn phòng 3D, nền lobby và màn phản xạ dùng cùng bảng màu.
- Một ván chơi là một canvas WebGL: các khẩu súng dạng hình được vẽ thẳng vào đó (một texture tối đa 1024 px) thay vì một lớp ảnh riêng, và tâm ngắm là một canvas 96 px ở giữa thay vì một canvas toàn màn hình; điểm bay lên sau mỗi phát trúng đã bị bỏ. Căn phòng không có ánh sáng (không sương mù, không tone mapping) với mọi đường kẻ trong một lần vẽ, các mục tiêu dùng chung hai material, mảnh vỡ và lỗ đạn lấy từ các pool nhỏ, súng 3D dùng material chuẩn gộp thành ba mesh, và không cấp phát gì mỗi khung hình. Dữ liệu chuột thô được cộng dồn và áp dụng một lần mỗi khung hình và mỗi lần nhấp; kết quả ván và HUD chỉ cập nhật khi có thay đổi; độ phân giải tự động được chọn một lần trong lúc đếm ngược. Nền lobby là display:none trong lúc chơi, phần đếm ngược là chữ thường, và một yêu cầu lobby đến trễ không còn để lại bộ hẹn giờ chạy trong ván.
- Sửa lỗi: ở giao diện tactical, tiêu đề lobby viết hoa bị tràn sang cột bên trên cửa sổ rộng; giờ nó tự co theo cột của mình.
- Settings có độ phân giải 3D (tự động, 100%, 75% hoặc 50%) và chỉ số FPS cho các ván, cả hai chỉ lưu trên thiết bị. Shader chạy ở độ chính xác trung bình.
- Ván chơi mượt hơn, mọi hiệu ứng vẫn giữ nguyên bên ngoài ván: góc nhìn xoay theo pointerrawupdate ở nơi trình duyệt hỗ trợ (chuyển động chuột ngay khi được báo), lớp tâm ngắm là một canvas độ trễ thấp chỉ vẽ lại khi có gì trên đó thay đổi, hình khẩu súng chỉ di chuyển khi nó thực sự di chuyển, và căn phòng 3D render không multisampling ở một pixel cho mỗi pixel CSS (tự hạ thấp hơn nữa khi khung hình bị chậm), với material Lambert và Phong, reflection map chỉ dành cho súng 3D, ít mảnh vỡ hơn và không cấp phát mỗi khung hình. Trong lúc chơi, scanline và vignette tắt và HUD không chạy hiệu ứng; lobby, hiệu ứng chuyển cảnh, intro và splash không đổi.
- Màu mục tiêu mặc định là xanh mòng két; người chơi còn dùng màu mặc định cũ (đỏ hoặc hồng) được chuyển sang màu này.
- Sửa lỗi: khi Settings đang mở ở tab Crosshair, nút Save & close không làm gì cả (các nút chỉnh hình súng của tab General được gắn trước và bị lỗi ở đó).
aimDISCORD9 thay đổi
Skin Valorant cho súng
- Skin Valorant cho súng: Settings có bộ chọn với mọi skin của mọi vũ khí (khoảng 1.400) và các biến thể màu của chúng, kèm danh sách vũ khí và ô tìm kiếm. Trong ván, skin được chọn hiện bằng đúng hình thật của nó, đặt nghiêng ở góc dưới bên phải, có cùng độ giật, lửa đầu nòng và độ lắc như các khẩu súng riêng của game.
- Hình ảnh và danh mục lấy từ valorant-api.com qua API của bot (một Activity trong Discord chỉ được tải từ nguồn của chính nó). Danh mục được giữ trong một ngày, hình ảnh được cache trong bộ nhớ, và trình duyệt có thể giữ chúng trong một tuần.
- Súng mặc định giờ là hình góc nhìn thứ nhất của một khẩu súng trên tay (assets/viewmodels/default.webp, 99 KB), cao bằng 54% chiều cao khung nhìn; súng 3D và skin Valorant vẫn có trong Settings.
- Skin cầm tay: hai mươi mốt bản render góc nhìn thứ nhất của một khẩu súng trên tay (Champions 2021, Kuronami, Prelude to Chaos, Mystbloom, Magepunk, Blackthorn, Golden Lion, Celestial, Ivory, Arctic, Ember, Golden Crystal, Bone Fang, Junkyard, Violet Spike, Blaze, Frostbite, Desert, Amethyst, Shadow, Stoneheart) trong một mục riêng ở Settings, với ô mẫu bằng hình, vẽ giống súng mặc định ở 54% chiều cao khung nhìn. Súng mặc định giờ là bản render sắc nét hơn của cùng khẩu Neptune.
- Các panel Settings lẽ ra phải ẩn lúc đầu (bộ chọn skin Valorant) không còn hiện ra trước khi được mở.
- Mượt hơn: không còn làm mờ trực tiếp phía sau các panel nằm trên nền chuyển động hay căn phòng 3D, nền lobby vẽ ở 30 khung hình mỗi giây và không có bóng canvas, căn phòng 3D có ít đèn hơn và material mục tiêu nhẹ hơn, render tối đa 1.25 pixel cho mỗi pixel CSS, và HUD chỉ ghi lại những con số đã thay đổi.
- Hình súng của riêng bạn: có thể tải trong Settings một ảnh PNG góc nhìn thứ nhất có nền trong suốt (một skin trên tay, giống cách game hiển thị), ảnh được đặt ở góc dưới bên phải khung nhìn, chỉnh kích thước bằng thanh trượt (mặc định 60%), giật khi bắn và trễ theo góc nhìn. Ảnh chỉ lưu trong trình duyệt đó (IndexedDB) và không bao giờ được gửi lên server.
- Hình của một skin Valorant giờ được cầm đúng như cách game cầm súng: đầu nòng nằm ngay bên phải và phía dưới tâm ngắm, báng súng đi ra từ góc dưới bên phải.
- Các phản hồi API lớn được nén gzip khi trình duyệt chấp nhận.
aimDISCORD8 thay đổi
Các ván được chơi ở góc nhìn thứ nhất trong một căn phòng 3D
- Các ván được chơi ở góc nhìn thứ nhất trong một căn phòng 3D. Tâm ngắm nằm yên ở giữa và chuột xoay góc nhìn, y hệt Valorant: 0.07° cho mỗi đơn vị chuột nhân với độ nhạy, trên góc nhìn ngang 103°. Mục tiêu là những viên ngọc trai lơ lửng trong một studio có tường kẻ ô; bắn trúng thì chúng vỡ tan, bắn trượt thì để lại dấu trên bức tường sau. Reaction vẫn là màn hình phẳng.
- Luật chơi và phần phát lại của server không đổi: các mục tiêu lơ lửng trên một mặt phẳng trước mắt, và điểm mà tia ngắm cắt mặt phẳng đó là thứ được chấm điểm.
- Một khẩu súng ở góc dưới bên phải khung nhìn, thiết kế riêng: giật lùi khi bắn, lóe sáng ở đầu nòng và trễ theo góc nhìn khi xoay. Bảy skin chọn tự do trong Settings (Ink, Chrome, Pearl, Carbon, Aurora, Gold, Neon glass), hoặc ẩn súng đi.
- Hai chế độ mới: Timing (mỗi lần một mục tiêu phình ra rồi mờ đi trong chưa tới một giây; bắn càng sớm càng nhiều điểm) và Switching (ba mục tiêu trôi, vỡ sau 0.7 giây nằm dưới tâm ngắm). Chín chế độ giờ bao quát flick, click, tracking, strafe, switching và phản xạ.
- Mùa 2: rank, bảng xếp hạng, điểm cao nhất cá nhân, chuỗi ngày daily và thành tích duel bắt đầu lại từ đầu. Các ván của Mùa 1 vẫn nằm trong cơ sở dữ liệu nhưng không còn được tính. Mùa hiện tại hiển thị ở lobby, trên thẻ hồ sơ và trong /bxh.
- Thẻ hồ sơ xếp chín chế độ, năm chế độ mỗi hàng.
- Khi không khóa con trỏ, cú nhảy do con trỏ rời khỏi khung rồi quay lại không còn làm góc nhìn bị giật lệch.
- Mã 3D (three.js) được tải ngầm từ lobby, nên trang đầu tiên vẫn nhẹ như trước.
aimDISCORD9 thay đổi
Giao diện mới, "Cover Issue"
- Giao diện mới, "Cover Issue": game được dàn trang như một tạp chí thời trang. Không còn màu đỏ: trang nền mực đen, hồng phấn là điểm nhấn duy nhất, bạc chrome cho phần kim loại, đường kẻ mảnh và góc vuông.
- Phông hiển thị mới Playfair Display (hỗ trợ tiếng Việt), đi cùng Inter Tight. Big Shoulders Display không còn nữa.
- Lobby ba cột đọc từ trái sang phải: mục lục (mỗi chế độ kèm điểm cao nhất), chế độ đang chọn dưới dạng dòng tít bìa hai dòng cùng thẻ rank và nút bắt đầu, và một cột bên cạnh có thử thách hôm nay, các trận duel đang mở và những ai đang ở trong phòng này. Trên điện thoại, mục lục thành một hàng tên chế độ cuộn ngang.
- Trang Career mở đầu bằng tên người chơi làm tiêu đề; bảng xếp hạng là "the list" với số thứ hạng in nghiêng và màu chrome cho top ba.
- Màn kết quả được in trên giấy kem: điểm số cực lớn, rank và các chỉ số trong những cột kẻ ô.
- Trong game: một studio ảnh sau giờ làm với dấu cắt (crop mark) và các mục tiêu ngọc trai màu hồng. Bài test phản xạ chuyển sang màu hồng khi "go" thay vì xanh lá, và màu mận trong lúc chờ.
- Độ nhạy chuột: con trỏ bị khóa trong lúc chơi một ván (raw input ở nơi trình duyệt cho phép) và di chuyển tâm ngắm theo thang của Valorant: cùng độ nhạy (0.01 đến 5) và cùng DPI chuột thì tâm đi xa đúng bằng trong Valorant, trên góc nhìn 103° của game. Có thể gõ giá trị vào một ô cạnh thanh trượt (tối đa ba chữ số thập phân, 0.175 hoặc 0,175). Có thể tắt tính năng này; ở nơi khung hiển thị không cho khóa con trỏ (Discord có thể từ chối), chuyển động của con trỏ bị ẩn vẫn điều khiển tâm ngắm theo độ nhạy đó. Nhấn Esc để thoát một ván đang khóa chuột.
- Màu mục tiêu mặc định giờ là hồng phấn; người chơi đang dùng màu đỏ mặc định cũ sẽ được tự động chuyển sang màu này.
- Thẻ hình ảnh trong chat dùng cùng giao diện tạp chí và cùng phông chữ.
aimDISCORD6 thay đổi
Giao diện mới, "Radianite Night"
- Giao diện mới, "Radianite Night": nền mực đậm với ánh cực quang chậm và lớp chấm mịn, các panel kính mờ có góc cắt, tín hiệu đỏ dành riêng cho hành động chính và màu bạc hà radianite cho mọi thứ đang trực tiếp.
- Phông chữ mới: Big Shoulders Display cho tiêu đề và con số, Inter Tight cho văn bản. Tên chế độ là kim loại đánh bóng chuyển ấm sang đỏ khi con trỏ lại gần.
- Trường bắn ở lobby có bụi radianite, các mục tiêu phát sáng với ánh viền, và dịu hơn ở phía sau các trang career và bảng xếp hạng.
- Trong game: một trường bắn ban đêm với sàn phối cảnh và các mục tiêu tự phát sáng.
- Màn kết quả: rank đứng trên một bệ kính được chiếu sáng.
- Thẻ hình ảnh trong chat dùng cùng giao diện và phông chữ.
aimDISCORD7 thay đổi
Chế độ mới
- Chế độ mới: Spidershot, Headshot (đường ngang ở độ cao đầu, độ chính xác tính gấp đôi) và Strafe (tracking kiểu ADAD). Ngưỡng rank của các chế độ này mới chỉ là ước lượng ban đầu và có thể sẽ được tinh chỉnh.
- Thử thách hằng ngày: mỗi ngày một chế độ và một seed cho tất cả mọi người, có bảng riêng cho server và toàn cầu, chuỗi ngày liên tiếp, một thẻ nổi bật ở lobby,
/thuthach, và bài đăng hằng ngày tùy chọn kèm người thắng hôm qua (/caidat kenh-thu-thach). - Duel 1v1:
/thachdau, chấp nhận trong chat hoặc trong game, cùng seed cho cả hai người, thẻ kết quả được đăng khi cả hai đã chơi; hết hạn sau 24 giờ. /hosovà/bxhtrả lời bằng thẻ hình ảnh (hồ sơ với mọi chế độ, bảng xếp hạng dạng bục podium); các icon rank dùng làm emoji riêng của app trong chat.- Role rank:
/caidat role-ranktạo một role cho mỗi bậc và giữ mỗi người chơi ở role ứng với rank cao nhất của họ. - Trang Career: biểu đồ tiến bộ của 30 điểm gần nhất cho mỗi chế độ, thành tích duel, chuỗi ngày daily. Bảng xếp hạng: bảng thử thách hôm nay. Các chế độ được nhóm lại ở lobby.
- Các ván daily và duel không bao giờ được tính vào rank hay các bảng xếp hạng thông thường.
aimDISCORD6 thay đổi
Nền lobby là một trường huấn luyện trực tiếp
- Nền lobby là một trường huấn luyện trực tiếp: sàn phối cảnh, đường quét chạy ngang, các mục tiêu lơ lửng mà bạn có thể bắn giữa các ván.
- Sàn và ánh sáng lấy màu theo rank của bạn ở chế độ đang chọn và chuyển mượt khi rank đổi.
- Tâm ngắm của chính bạn là con trỏ chuột ở lobby.
- Vòng chữ xoay hiển thị rank và RR quanh các biểu tượng lớn.
- Tên tab và tên chế độ được giải mã khi rê chuột; các chữ cái trong tiêu đề nghiêng và nóng lên khi con trỏ lại gần; tiêu đề các mục hiện dần từ nét viền như được tô mực.
- Lượng RR nhận được được đóng dấu lên màn kết quả.
aimDISCORD6 thay đổi
Các icon bậc rank thi đấu chính thức của Valorant cho mọi rank, dùng theo chính sách…
- Các icon bậc rank thi đấu chính thức của Valorant cho mọi rank, dùng theo chính sách nội dung của người hâm mộ của Riot Games (có tuyên bố miễn trừ trong Settings).
- Màn mở đầu, hiệu ứng quét chéo giữa các tab, nền sống động, nút bắt đầu kiểu lock-in và màn splash trận đấu.
- Trong game: mục tiêu bật ra, điểm bay lơ lửng, bộ đếm chuỗi trúng, rung màn hình khi bắn trượt, cảnh báo đỏ trong 5 giây cuối.
- Nghi thức kết quả: biểu tượng rank hạ xuống kèm tia sáng và sóng xung kích, điểm và RR đếm lên, biểu tượng cũ vỡ tan khi thăng hạng, mảnh vỡ bắn tung tóe.
- Các thẻ career nghiêng theo con trỏ; các hàng bảng xếp hạng trượt vào, các hàng đầu và Radiant tỏa sáng.
- Mọi thứ chuyển về màn hình tĩnh khi bật giảm chuyển động.
aimDISCORD4 thay đổi
Rank từ Iron 1 đến Immortal 3 với Rank Rating, và Radiant dành cho top 10 toàn cầu ở…
- Rank từ Iron 1 đến Immortal 3 với Rank Rating, và Radiant dành cho top 10 toàn cầu ở Immortal 3; thăng hạng và lượng RR nhận được hiện trên màn kết quả.
- Giao diện mới: lobby có chọn chế độ, trang career với rank của mọi chế độ và thang rank, bảng xếp hạng đầy đủ với biểu tượng rank.
- Trình chỉnh tâm ngắm đọc và ghi mã hồ sơ định dạng Valorant, có xem trước kích thước thật và phóng to; độ lệch khi bắn nở ra trong game.
- Tên rank và RR trong
/bxhvà/hoso.
aimDISCORD6 thay đổi
Bộ luyện aim dạng Discord Activity
- Bộ luyện aim dạng Discord Activity: Gridshot, Microshot, Tracking và Reaction.
- Phát lại phía server mọi ván chơi từ một nhật ký sự kiện theo seed; ván lỗi định dạng bị từ chối, ván đáng ngờ bị gắn cờ và giữ ngoài các bảng xếp hạng.
- Bảng xếp hạng phòng, server và toàn cầu trong Activity;
/bxh,/hoso,/aim,/trogiup,/caidat kenh-ky-luctrong chat. - Cài đặt tâm ngắm, màu mục tiêu, âm thanh và ngôn ngữ cho từng người chơi.
- Tiếng Việt và tiếng Anh.
- Docker image kèm health check, sao lưu cơ sở dữ liệu hằng ngày, script tự cập nhật.
bookingDISCORD8 thay đổi
Giảm giá giờ vắng (/admin cai-dat, "Giảm giá giờ vắng")
Doanh thu
- Giảm giá giờ vắng (
/admin cai-dat, "Giảm giá giờ vắng"): giảm theo phần trăm, tối đa 50, trong các khung giờ giống như khung giờ cao điểm. - Gói thành viên (
/thanhvien): mua từ ví, giảm một phần trăm cho mọi lượt đặt lịch trong một số ngày; gia hạn sớm sẽ cộng thêm ngày. - Mọi khoản giảm giá tự động, kể cả khi có phiếu giảm giá, chỉ trừ vào phần phí, nên phần của người chơi không bao giờ thay đổi.
- Tip sau buổi chơi (tối đa 2.000.000 đ, mỗi lượt đặt lịch một lần, trả từ ví): toàn bộ số tiền thuộc về người chơi dưới dạng một dòng sổ cái
TIP, có thể thanh toán ngay. Bảng sổ cái được dựng lại một lần khi nâng cấp để cho phép loại mới này. - Mã giới thiệu (
/gioithieu): cả hai bên nhận tiền vào ví sau buổi chơi đầu tiên của người mới có giá trị đủ lớn. - Thẻ quà tặng (
/quatang) giữa các ví, và gợi ý người chơi (/goiy) kèm lý do cho từng lựa chọn.
Thanh toán
- Chuyển khoản ngân hàng thẳng vào tài khoản của chủ (
/admin nhan-tien,/admin cho-xac-nhan): một ảnh VietQR kèm số tiền và nội dung, một nút xác nhận cho chủ, các xác nhận trễ sẽ được hoàn tiền; cũng có trên trang đặt lịch web. Được dùng khi không có cổng thanh toán nào có khóa.
Tin cậy và an toàn
- Huy hiệu Đã xác minh do staff đặt (
/staff xac-minh), một nút Khẩn cấp trong mỗi phòng sẽ báo cho staff và chủ và đóng băng buổi chơi đang chạy giống như một khiếu nại, người chơi đánh giá khách hàng (chỉ staff xem được), và một mức rủi ro trong/staff xem-khachvới mọi lý do được liệt kê.
- Giảm giá giờ vắng (
bookingDISCORD25 thay đổi
Stripe là cổng thứ hai phía sau một interface chung (src/pay/gateway.js), chọn bằng…
Đã đủ tính năng; đang chờ lần chạy đầu tiên trên một server thật và khóa thanh toán thật (xem README).
Tiền
- Stripe là cổng thứ hai phía sau một interface chung (
src/pay/gateway.js), chọn bằngPAYMENT_PROVIDER; hoàn tiền Stripe được gửi ngược về thẻ tự động, với một idempotency key cho mỗi dòng sổ cái và mỗi đơn (jobrefunds). Tiền về trễ qua Stripe cũng được hoàn theo cách tương tự. - Webhook payOS (có chữ ký, chỉ là một tín hiệu nhắc: khoản thanh toán luôn được xác nhận từ phản hồi của chính payOS) và lệnh gọi
cancelPaymentLink. - Ví trả trước: các gói nạp tiền kèm thưởng, trả tiền đặt lịch từ ví hoặc bằng link (không bao giờ cả hai), hoàn tiền của các lượt đặt lịch đã trả bằng ví sẽ quay lại ví, chủ chỉnh sửa số dư, và tiền ví cùng chi phí thưởng được tính vào số liệu của chủ.
- Điểm thân thiết: tích lũy từ các buổi chơi đã hoàn thành, đổi thành tiền trong ví.
/chuyentien: thông tin ngân hàng cho từng dòng, ảnh VietQR đã điền sẵn số tiền và nội dung, xuất CSV của hàng đợi, toàn bộ sổ cái và tất cả lượt đặt lịch. Khách hàng và người chơi lưu tài khoản của mình bằng/nganhang.- Mã giảm giá (
/magiamgia): theo phần trăm hoặc số tiền cố định, số lượt dùng, giới hạn mỗi người, giá tối thiểu, ngày hết hạn; được trừ vào phí nền tảng nên phần của người chơi không bao giờ thay đổi; được giữ bởi một lượt đặt lịch chưa thanh toán và trả lại khi nó hết hạn hoặc bị hủy. - Giá theo từng game và phụ thu giờ cao điểm (tính theo mỗi nửa giờ);
quoteBookinglà nơi duy nhất tạo ra một mức giá. - Thanh toán trùng, gia hạn có trả tiền mà buổi chơi không còn nhận được nữa, và các link mới trả một nửa sẽ được báo để hoàn tiền thủ công thay vì bị bỏ qua lặng lẽ.
Đặt lịch
- Gia hạn một buổi chơi đang diễn ra ngay từ phòng (theo bước 30 phút, chừng nào người chơi còn rảnh, số phút được giữ trong lúc link còn mở).
- Danh sách chờ có giữ chỗ cho người đứng đầu hàng; lặp lại hằng tuần với một nút xác nhận ba ngày trước mỗi tuần; đặt lại từ lời cảm ơn sau khi đánh giá và từ
/lichcuatoi. /timplayer: lọc theo game, giá, đánh giá, ngôn ngữ và "rảnh ngay bây giờ"; năm cách sắp xếp; khung giờ rảnh kế tiếp.- Bộ chọn giờ bằng menu (
/lichranh chon:true); ảnh và giọng mẫu dưới dạng link; giá theo từng game; thẻ hồ sơ có huy hiệu, giờ làm và độ tin cậy. - Bảng xếp hạng (
/bangxephang, một bài đăng hằng tháng), huy hiệu (top của tháng, 50 và 100 giờ, đúng giờ, khách hàng trung thành). - Một buổi chơi bắt đầu ngay khi người thứ hai vào phòng voice (sự kiện voice), không phải ở tick kế tiếp; hai đường này không bao giờ chồng lên nhau.
- Một người chơi đã rời server sẽ được phát hiện (Unknown Member), bị tạm dừng, và các lượt đặt lịch sắp tới của họ được hoàn tiền.
Con người và an toàn
- Ghi chú nội bộ và thẻ staff cho từng khách hàng, một cờ cho những khách hàng liên tục thua tranh chấp, báo cáo ẩn danh với người báo cáo được băm.
- Nhật ký kiểm toán của mọi hành động của staff và chủ trong cơ sở dữ liệu (
/admin nhat-ky).
Nền tảng
- Web server (tùy chọn): dashboard cho chủ với biểu đồ, JSON và CSV,
/metrics,/healthz, webhook payOS; xác thực bằng token với giới hạn tốc độ theo địa chỉ. - Nhiều server trong một bot: một cơ sở dữ liệu cho mỗi server, license (
/kichhoat,npm run license), khóa thanh toán riêng cho từng server, các nút trong tin nhắn riêng mang theo server của chúng. - Tiếng Anh và tiếng Việt: một lớp dịch cho mọi thứ gửi riêng cho một người,
/ngonngu, tự động theo ngôn ngữ của ứng dụng Discord; một test sẽ báo lỗi khi còn sót tiếng Việt trong các luồng tiếng Anh. - Log có cấu trúc,
npm run restore,npm run smoke,npm run check(cú pháp, import không dùng, phiên bản), cơ sở dữ liệu cũ được nâng cấp tại chỗ, workflow phát hành tạo một bản release GitHub từ chính file này.
Thay đổi
OWNER_IDSchỉ áp dụng cho bản cài đặt một server.- Biểu mẫu đặt lịch có thêm hai trường tùy chọn (mã giảm giá, lặp lại hằng tuần); lời chào trong phòng có thêm nút Gia hạn;
/lichcuatoicó các nút đặt lại. - Tin nhắc lịch đọc là "Nhắc lịch #N, buổi hẹn với X: ..." để có thể dịch được.
- Job thanh toán: một khoản thanh toán đã xác nhận có thể mua một lượt đặt lịch, một lần gia hạn hoặc một lần nạp ví.
- Stripe là cổng thứ hai phía sau một interface chung (
bookingDISCORD12 thay đổi
/setup
/setup: trình dựng idempotent cho các vai trò (Khách, Người chơi, Trusted, Khách quen, Staff), danh mục và kênh, với permission overwrite được ghi lại mỗi lần chạy, các bảng điều khiển được sửa tại chỗ, một bước kiểm tra an toàn vai trò (quyền mạnh, thứ bậc, quyền của bot) và một báo cáo bằng tiếng Việt. Không có gì bị xóa.- Cổng tuổi: nút, modal với câu xác nhận,
attest(), vai trò Khách. Nội quy và hướng dẫn do bot đăng; hướng dẫn hiển thị các mức hủy lịch đang áp dụng. - Người chơi: modal đăng ký, hàng đợi cho staff với duyệt và từ chối (lý do nhập qua modal), thẻ hồ sơ được sửa tại chỗ,
/lichranhvới các lỗi phân tích bằng tiếng Việt,/playercho hồ sơ, tạm dừng và tiếp tục,/thunhap. - Đặt lịch:
/datlich, nút đặt trên các thẻ và một menu chọn người chơi, modal, báo giá, link payOS, hủy kèm xem trước số tiền hoàn theo từng mức, bộ thông báo thanh toán (xác nhận, hoàn tiền thanh toán trễ, cảnh báo thanh toán một phần), phòng text và voice riêng tư, đánh giá qua modal (cũng từ tin nhắn riêng),/lichcuatoi. - Job lập lịch: nhắc lịch, phòng, bắt đầu khi có người vào voice, no-show với thêm một tick, tự kết thúc, nhắc đánh giá, gỡ các nút đánh giá, đóng phòng; các hành động của cờ chỉ được đánh dấu sau khi phía Discord đã làm xong.
- Tranh chấp: báo cáo qua modal, ticket với ba nút giải quyết và một bước xác nhận (cảnh cáo hoặc xóa cảnh cáo), chia tiền qua modal, phòng được giữ trong lúc tranh chấp và đóng sau đó,
SETTLED_ALREADYđể vụ việc ở trạng thái mở. - Công cụ cho staff:
/staff(hàng đợi, tranh chấp, hủy, cảnh cáo, gỡ đình chỉ, blacklist, tóm tắt); đình chỉ ở lần cảnh cáo thứ ba sẽ gỡ vai trò, đánh dấu thẻ và đưa ra một nút hủy các lịch sắp tới. - Tiền: hàng đợi
/chuyentienvới một nút cho mỗi dòng, các khoản chi bị giữ nằm riêng với một nút ép chi sau bước xác nhận thứ hai, mọi bước đều được ghi vào kênh tiền chỉ dành cho chủ; bản tổng hợp hằng ngày hoặc hằng tuần cho chủ;/admincho cài đặt, sao lưu và các đơn gần đây. - Job hằng ngày: vai trò Trusted và Khách quen (thành viên được lấy từng người một), làm mới thẻ và hướng dẫn, sao lưu.
- An toàn: một cổng truy cập duy nhất (blacklist, 18+, quyền) trong mọi handler, giới hạn tốc độ,
sanitizeTextcho mọi văn bản của người dùng,allowedMentionstrên mọi lần gửi, trả lời riêng tư cho dữ liệu cá nhân, allowlist vai trò, không dùng privileged intent. - Bổ sung của giai đoạn 1: thêm các khóa cài đặt kênh, một bảng
kv,getLedgerRow, và job thanh toán giờ báo một link đã đóng mà chỉ trả được một phần. - 106 test mới với guild, client và interaction giả.
bookingDISCORD13 thay đổi
Khung dự án
- Khung dự án: ESM, Node 22.13 trở lên, chỉ dùng
discord.jsvàdotenv, Dockerfile và file compose với health check heartbeat, CI cho test và build image, trình cài đặt cho Raspberry Pi và các script tự cập nhật. - Lớp dữ liệu: các bảng SQLite cho cài đặt, người chơi, lịch rảnh, lượt đặt lịch, sổ cái, cảnh cáo, blacklist, tranh chấp, xác nhận tuổi và đơn hàng, tạo theo kiểu idempotent với các ràng buộc CHECK và unique index làm nền cho các quy tắc idempotency.
- Phân tích và định dạng lịch rảnh (
T2 19:00-23:00; CN 09:00-12:00, ngày viết đầy đủ,19h30),isWithincó nhận biết múi giờ với các lượt đặt lịch qua nửa đêm được tách tại 0 giờ. - Tính giá bằng số nguyên đồng chính xác với phí được làm tròn đến 1.000, và phân tích ngày giờ và thời lượng đặt lịch nhập trong modal.
- Chính sách hủy với các mức lấy từ cài đặt; người chơi hủy luôn được hoàn tiền đầy đủ và bị một cảnh cáo.
- Quy tắc tạo lượt đặt lịch và máy trạng thái của lượt đặt lịch dưới dạng một bảng chuyển trạng thái tường minh, với tiền được ghi trong cùng transaction với việc đổi trạng thái.
- Sổ cái: chia tiền chính xác cho các lượt đặt lịch đã hoàn thành, đã hủy, no-show và bị tranh chấp, giữ khoản chi trả trong thời gian xem xét,
markPaididempotent, hoàn tiền thanh toán trễ. - Đánh giá một lần cho mỗi lượt đặt lịch trong một khoảng thời gian, nhận xét được làm sạch, quy tắc vai trò người chơi tin cậy và khách quen.
- Cảnh cáo với đình chỉ tự động, gỡ đình chỉ, blacklist.
- Hàm quyết định của bộ lập lịch
dueActionsvàmarkActionDone. - Client payOS và phần xử lý đơn hàng được sao chép và điều chỉnh từ dự án anh em, với
checkPaymentsxử lý mỗi đơn đúng một lần. - Bản tổng hợp cho chủ và thu nhập của người chơi.
docs/design.md: bản đặc tả cho lớp Discord.
- Khung dự án: ESM, Node 22.13 trở lên, chỉ dùng
brainDISCORD10 thay đổi
Chatbot
Phiên bản đầu tiên.
- Chatbot. Trả lời khi được nhắc tên, được reply, hoặc nhắn trực tiếp, chỉ trong những kênh mà quản trị viên đã cho phép. Persona riêng cho từng server (
/ai nhanvat: tên, tính cách, ngôn ngữ, độ dài câu trả lời, emoji, năm preset). Không dùng Message Content intent. - Model. Anthropic Messages API, Google Gemini và mọi endpoint tương thích OpenAI (Ollama, LM Studio), tất cả đều qua
fetchvới timeout, thử lại có backoff khi gặp 429/5xx và tool calling được chuẩn hóa. - Bộ nhớ. Các lượt hội thoại ngắn hạn cho mỗi cuộc trò chuyện với việc cắt bớt theo ngân sách token và một khoảng thời gian lưu giữ; các sự kiện dài hạn được lưu qua công cụ
remember, có thể xem và xóa bằng/ai trinhnho,/quenroiđể tự mình quên hoàn toàn, và một job dọn dẹp. - Cơ sở kiến thức.
/kienthuc them|danhsach|xoavới văn bản từ một biểu mẫu, một file đính kèm.txt/.mdhoặc một đường link; được chia đoạn và xếp hạng bằng BM25 tích hợp sẵn trong bot; câu trả lời sẽ nói rõ khi không biết. - An toàn và chi phí. Giới hạn độ dài đầu vào, thời gian chờ, giới hạn tốc độ theo từng thành viên và từng server, ngân sách token hằng ngày và các gói lưu trong cơ sở dữ liệu, công tắc ngắt khẩn cấp (
/ai tat),/adminchỉ dành cho chủ bot, không ping, đầu ra được tách thành các đoạn 2000 ký tự,/xoadulieu, dữ liệu bị xóa khi bot bị gỡ khỏi một server. - Agent. Vòng lặp công cụ với giới hạn cứng về số bước, token, thời gian và số lần gọi công cụ, hỗ trợ hủy giữa chừng, tiến độ hiển thị trên một tin nhắn được sửa liên tục, một hàng đợi với giới hạn đồng thời theo từng server và toàn cục, và một nút hủy. Các công cụ:
web_search(Brave, Tavily hoặc SearXNG),fetch_pagevới cơ chế chống SSRF và bộ trích xuất HTML,calculate,github_readchỉ đọc với allowlist riêng cho từng server,remember. - Lệnh.
/hoi,/research(báo cáo có cấu trúc kèm nguồn được dựng từ những trang thực sự đã đọc) và/phantich-issue(chẩn đoán và bản vá đề xuất chỉ ở dạng văn bản). - Phòng thủ prompt injection. Đầu ra của công cụ được đặt trong dấu phân cách và gắn thẻ là dữ liệu không đáng tin; không có công cụ nào gây tác dụng phụ ngoài
remembergiới hạn theo từng thành viên; các lần gọi công cụ được ghi nhật ký kiểm toán nhưng không kèm nội dung trang (/ai nhatky). - Vận hành. SQLite với WAL, volume
DATA_DIR, route/status, health check heartbeat, Docker Compose trên một cổng loopback, các script cài đặt và tự cập nhật cho Raspberry Pi. - 226 test.
- Chatbot. Trả lời khi được nhắc tên, được reply, hoặc nhắn trực tiếp, chỉ trong những kênh mà quản trị viên đã cho phép. Persona riêng cho từng server (
feedDISCORD11 thay đổi
Nguồn
Bản phát hành đầu tiên.
- Nguồn.
/theodoitheo dõi một kênh YouTube (feed công khai của kênh; nhận URL kênh,@handlehoặc idUC...), một kênh Twitch (Helix API, chỉ khi đã đặtTWITCH_CLIENT_IDvàTWITCH_CLIENT_SECRET), bất kỳ feed RSS 2.0 hoặc Atom nào, hoặc một trang web (văn bản hiển thị được băm, và khi nó thay đổi sẽ đăng một thông báo ngắn, tối đa mỗi 15 phút một lần)./huytheodoi,/danhsach,/thuvà/capnhatlần lượt dùng để xóa, liệt kê, thử và sửa các nguồn: ping role, mẫu tin nhắn với{title} {url} {author} {source}, bộ lọc từ khóa bao gồm và loại trừ. - Không đăng lặp. Mỗi nguồn nhớ những gì nó đã thấy. Lần đọc đầu tiên khi thêm nguồn là im lặng, nên các bài cũ không bao giờ bị đăng lại. Một buổi stream Twitch chỉ được thông báo một lần mỗi lần bắt đầu stream.
- Lỗi. Mỗi nguồn giãn thời gian thử lại sau khi lỗi (nhân đôi, tối đa sáu giờ) và bị tạm dừng sau
MAX_FAILURESlần lỗi liên tiếp, kèm một thông báo trong kênh./capnhat tieptuc:truesẽ cho nó chạy lại. - Hàng đợi gửi đi. Mọi bài đăng đều đi qua một hàng đợi nhỏ: mỗi kênh một tin nhắn mỗi giây, vài tin mỗi nhịp, gửi lỗi thì thử lại rồi bỏ.
- GitHub. Một bộ nhận HTTP tại
POST /github/<token>kiểm traX-Hub-Signature-256bằng secret riêng của từng lượt đăng ký (so sánh thời gian không đổi). Hỗ trợ push (các commit gộp thành năm dòng), pull request, issues, issue comment, CI (workflow run và check suite, xanh hoặc đỏ), release, deployment status và ping./github ketnoi,ngat,danhsach,sukien. - Deploy và lỗi.
POST /deploy/<token>thông báo một lần deploy từ một script.POST /errlog/<token>nhận lỗi ứng dụng và gom nhóm theo dấu vân tay của thông báo lỗi và khung stack đầu tiên: lần xuất hiện đầu tiên được đăng ngay, các lần sau được đăng dưới dạng cập nhật số lượng tối đa mỗi 10 phút, và đăng ngay khi lỗi quay lại sau một giờ yên ắng hoặc sau khi đã được đánh dấu là đã giải quyết./webhooktạo và xóa các token,/errlogliệt kê các nhóm lỗi hàng đầu và đánh dấu giải quyết một nhóm. - Uptime.
/monitor them,xoa,danhsach: kiểm tra HTTP mỗi vài phút, báo DOWN sau hai lần lỗi liên tiếp, báo UP kèm thời lượng ngừng hoạt động, và phần trăm uptime tính từ 24 giờ gần nhất. - An toàn địa chỉ. Mọi địa chỉ do người dùng nhập đều đi qua một lớp bảo vệ duy nhất: chỉ http và https, không có thông tin đăng nhập, DNS được phân giải và các dải loopback, private, link-local, CGNAT, multicast, reserved và metadata đều bị từ chối (IPv4, IPv6, IPv4-mapped và các cách viết thập phân, thập lục phân hay bát phân), kiểm tra lại sau mỗi lần chuyển hướng, có giới hạn số lần chuyển hướng, giới hạn kích thước và timeout.
- Giới hạn. Server miễn phí được 3 nguồn, 1 repo và 2 monitor (
FREE_LIMITS)./admin gioihannâng giới hạn cho một server,/admin xemhiện mức đã dùng. ChỉOWNER_IDSmới dùng được/admin. - Vận hành.
/statuskèm phiên bản và thời gian chạy, health check theo heartbeat, một Docker image và file compose với bộ nhận trên127.0.0.1:8790, vàdeploy/pigồm script cài đặt và tự cập nhật hằng ngày có rollback. - Chỉ dùng Guilds intent. 154 bài test.
- Nguồn.