Repository navigation
feat: comebacks, champ-select quick phrases and their shortcut, shortcuts and typing in games, and the QQ group - #43
Merged
Merged
Conversation
…backs' commands - elevation: read another process's rights (TokenRead, token_of) and whether they outrank winer's; ask once per run to restart elevated when typing into the game is set up and the connected client outranks winer, at connect or when the settings change while connected. - game_chat: type nothing into a game that outranks winer (NeedsAdmin), log the keys still held, prefix every all-chat message with "/all " within the message limit, and map typing to the comeback notices. - hotkey: the callout's slot becomes one of three, with the comebacks' team and all-chat shortcuts; the handler tells the four apart by id, and one press at a time goes out across the callout and the comebacks. - commands: open_community, send_phrase, comeback_library, download_comeback_library and remove_comeback_library. - diagnostics: a refused comeback shortcut fails the self-check like the callout's.
…the QQ group row - A Comebacks (反击) page, Ctrl+7, last in the Assistant group: the user's own lines (add, edit, remove, count), the team and all-chat shortcuts with their registration status, in-game sending with its risk line, champ select's quick phrases with the language's default and a preview, and the online library, downloaded only after a confirmation and used only once its switch is on. - The Live page's champ-select board gives each teammate other than the user a menu of the phrases, sent with the view's game id and the teammate's cell. - Where in-game typing is switched on (the Comebacks page and Automation's callout), a line says a game started from WeGame drops winer's keys unless winer runs as administrator, with the restart. - Settings > About: a Community row that opens the QQ group and copies its number. - Notices for comebacks sent, stopped (with the count) and skipped, and the new skip reasons; no shortcut records another's combination, and one recorder listens at a time.
…update the test counts
…ly lines that went out, and keep the library's switch when its file cannot be written
…the swap phrase by its own shortcut The system's shortcuts (RegisterHotKey) never reached winer while the game had the screen: the owner's log of 2026-11-03 has every press in the lobby and champ select and none in three games, with winer elevated. While a game runs, a WH_KEYBOARD_LL hook now hears the same combinations, takes only an exact one with the game's window in front, and passes every other key untouched. The Comebacks page's quick phrases gain a shortcut: in champ select, after Trade on a teammate in the client, it sends the first phrase for the teammate whose trade is SENT. The shortcuts panel warns while there is no line to send, and the no-lines notice says where to add one.
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
RegisterHotKey)ever reached winer while the game had the screen: every press in the lobby and champ select is in
the log, none in any game, with winer elevated. While a game runs (
GameStart,InProgress,Reconnect),app/src-tauri/src/game_keys.rsnow listens through aWH_KEYBOARD_LLhook, asZuAnBot does: only an exact combination winer holds, pressed with the game's window in front, goes to
winer instead of the game; every other key passes untouched, and no key is logged.
game: WeGame starts the client, and so the game, elevated, and
SendInputfrom a winer withoutelevation is dropped by UIPI with no error (
docs/platform-notes.md). winer now reads the gamewindow's token before it types (
elevation::token_of); when the game outranks it, nothing is typedand Activity says why (
needsAdmin). With in-game typing set up (the callout's or a comeback'sswitch and shortcut), winer asks once at connect, or when that setting changes while connected, to
restart elevated when the client outranks it; a refusal is final for the run. Automation's in-game
row and the Comebacks page show the rights note with 以管理员身份重启 while winer is not elevated.
Ctrl+7). The user's own lines (100 of 200 characters; winer shipsnone), one at random a press and never the same twice in a row; two shortcuts, 发到队伍 and
发到全体 (
/all, split into prefixed pieces); champ select's chat through the client's API,the game's chat by typing only with 在游戏里输入 on (off by default); 3 s between two sends;
comebackSent,comebackStoppedandcomebackSkippedin Activity. The four shortcuts never sharea combination.
has a phrase menu;
send_phrase(index, gameId, cellId)fills the seat (5L), champion and name andposts one message, and refuses another champ select, the user's own cell and any cell not of the
team, so a menu left open sends nothing to the wrong player. Default: 「{seat}大佬,小弟想玩下{champion},给您磕一个了」.
Its own shortcut, 发给交换的队友 (none by default): after 交换 on a teammate in the client, a press
sends the first phrase for the cell whose trade reads
SENT(ChampSelectSession.trades; theclient's
/helpnames the states), behind the same 3 s spacing; Activity says when no trade wasasked. The Comebacks page warns while there is no line to send.
cndiandian/zuanbot.com(Apache-2.0), pinned tocommit
a79264d5, 970752 bytes and its SHA-256, fetched only after the confirmation(我已了解,下载) from jsDelivr's mirrors, then GitHub, through the system proxy; read by a small
bounds-checked SQLite reader (
crates/core/src/sqlite.rs), cleaned to 682 + 994 lines and kept incomeback-library.json. Every download and every removal saves the switch off, so it is alwaysopted into again; nothing of the library is in the repository.
the link, the number and the card (
docs/site/public/community/qq-group.png), which reaches thesite once feat(winer): 文档同步复制交流群二维码所在的 public/community 目录 firlab#119 (the sync copies
public/community) is merged.the new address and the new file),
docs/platform-notes.md,DESIGN.md,AGENTS.md.Tested
scripts/evidence.shwith the CI toolchain (RUSTUP_TOOLCHAIN=1.96.0) on47fe510(d8a2173and82c9945change docs only), every gateexit=0: fmt, clippy-D warnings,cargo test --workspace(lcu 12, shell52, winer-core 331 + 1 ignored), lcu and winer-core alone,
cargo xwin check, pnpm format, lint,typecheck and test (shared 7, plugin 72, desktop 161); also
cargo xwin clippy -p winer -D warnings.restarted elevated (
elevated=true); the callout and comebacks went to champ select's chat. With47fe510, in an ARAM game, Alt+5 loggeda shortcut pressed in the game, thentyping into the game's chat ... elevated=true game=Elevated, and the line reached the team chat (twice); the hookwas installed at each game's start and removed at its end.
cargo test -p winer-core pinned_library -- --ignored→mild 682 strong 994 sha256 ee2a22ee….which champ select it holds before the chat room is looked up and again after; a switch in between
sends nothing (tested with a fake client). The 3 s spacing and the no-repeat rule count only a line
that reached the chat, from when it finished.
the confirmation with the focus on 取消; only 我已了解,下载 downloaded (
downloaded the library mild=682 strong=994in winer's log, from a network in China); 使用在线语录 stayed off until turned on;移除 deleted
comeback-library.jsonand savedlibrary.enabled = false; Settings › About shows the交流群 row (its buttons were not clicked: a person uses that desktop).
Not tested
/allon Tencent's servers, the callout typed into a real game, and the quick phrase's shortcut ona real trade (no
SENTcaptured yet: the owner asked nobody while the read-only recorder ran).BEGIN_COMMIT_OVERRIDE
feat: 「反击」页(新菜单,Ctrl+7):按快捷键随机发一句你自己写的反击语句,选人时发到选人聊天,打开「在游戏里输入」后可输入游戏的队伍或全体聊天,两次发送至少间隔 3 秒;还没有可发的语句时页面会提示 (#43)
feat: 选人快捷语:英雄选择中点对局页队友旁的菜单,把填好楼层和英雄的一句话发到选人聊天,例如「5L大佬,小弟想玩下龙王,给您磕一个了」;也可以先在客户端对队友点「交换」,再按「发给交换的队友」快捷键发出 (#43)
feat: 反击可以使用开源的祖安语录(在线语录):下载前要确认,下载后要自己打开才会使用,文件按 SHA-256 校验,可随时移除 (#43)
feat: 设置 › 关于新增 QQ 交流群「winer交流群」(群号 1109319256),可一键加入或复制群号 (#43)
fix: 游戏中按快捷键没有反应:游戏在前台时 Windows 的系统快捷键传不到 winer,现在游戏进行中改由键盘钩子接收你设置的组合键,只接手这几个组合键,其他按键原样交给游戏 (#43)
fix: 从 WeGame 启动的游戏收不到 winer 输入的文字:游戏以管理员身份运行时会丢弃权限较低程序的按键;现在输入前先检查权限,不够时在动态里说明,并在连接客户端时请求一次以管理员身份重启 (#43)
END_COMMIT_OVERRIDE