All commands are typed in a window's text field preceded by /, or can be
used inside a script (alias, event, popup) without the slash. They're the same commands, with the same
behavior, in both contexts.
$identifiers
are not substituted) - use // instead of / to force evaluation, e.g.
//echo my nick is $me..say/.msg instead of
say/msg, official mIRC docs: "a dot in front of a command makes it execute silently")
sends the message WITHOUT showing it automatically - useful in an on input to build your own echo
with a custom format/color (echo -r) without seeing it twice - works on both networks: on WhatsApp
the echo would still arrive from WhatsApp's own multi-device sync, but Yoake already knows that exact message's
id (Baileys returns it right away when sending) and discards it on its own when it arrives, instead of showing it
a second time./bhelp - typed in any window, prints a quick list of the most
used commands with one example each (only the ones meant for interactive use in chat, not the scripting ones
further below) - also shown as a hint in Status as soon as you open Yoake.| Command | What it does |
|---|---|
/connect | Opens the network/login selector, or reconnects the current window's network. |
/server -m [telegram|whatsapp|twitch] | As in real mIRC: always opens a NEW dedicated Status window for the connection, instead of reusing/converting the one already open for that network. Without a network given it shows the normal selector, but still forces a dedicated window once the connection succeeds. The same is available from the connection dialog via the "Open in a new Status window" checkbox. On Twitch this is like adding a second account: each Twitch account gets its own Status window, channels and whispers. |
/disconnect | Disconnects the current window's network. |
/list [text] | Without text: list of your groups/channels. With a search text, on Telegram it ALSO searches public channels/groups you haven't joined yet (same search as the official client) - in the window that opens, the ones you're already in are blue (double click opens), new ones are green with "+ Join" (double click joins and opens right away). On WhatsApp it stays limited to your own (Baileys has no public group search). On IRC it's the server's real LIST command (official mIRC documentation): it ALWAYS shows the server's entire public channel directory, not just your own - name, real-time user count and topic for each one. The window also has a search box at the top (like /contacts): typing there redoes the same search without having to close and reopen with /list <text>. |
/join | Joins a group via invite link. |
/quit | Closes the whole application (not specific to one network). |
/list, the column headers (Name/Type/Description/Members)
are clickable to sort the already-loaded list - this applies to the channel/group list window of any network, not
just IRC. Clicking "Members" sorts descending first (most users on top), a second click reverses it; text columns
sort A-Z first instead. The number in the Members column is colored green if you haven't joined that channel/group
yet, the same convention already used for the name's color.t.me/channelname link (or an invite link t.me/+...) inside a message opens
it INSIDE the app instead of the browser - if you're already subscribed it opens right away, otherwise it asks for
confirmation before joining (like the official client, it doesn't blindly join a channel that might be linked by a
stranger). Same behavior for WhatsApp invite links chat.whatsapp.com/....| Command | What it does |
|---|---|
echo <text> | Writes a local message (visible only to you) in the current window, with sender "Script". |
echo -r <text> | Like echo, but without the "Script" sender: prints just the text, a bare line - like real mIRC does (which never has a structured sender for /echo). Useful for building your own colored <nick> with $chr(3) inside an on message with haltdef, without losing the real name of who wrote it. |
say <text> | Writes in the current window, actually sending it. |
me <text> | Official mIRC docs: sends an action ("* nick does something") instead of a normal message, in the current window. On IRC it uses the real CTCP ACTION mechanism, the same one other IRC clients (including real mIRC) expect for "/me" - an incoming CTCP action from another client is now correctly shown in italics, instead of the raw escape-code text. On Telegram/WhatsApp it keeps the previous behavior (italics via markdown), visible only inside Yoake itself. |
msg <nick|#channel|number> <text> | As in real mIRC the target is always required: a nick sends a private message, the current channel/group's name (with or without #) writes there - same as "say". Looks first in the current window's nicklist; if not found there (our own extension, real mIRC has no address book), it searches the whole network's address book by number/id (always unique) or by name, but ONLY if the name is unique - two contacts with the same name give an ambiguity warning instead of guessing, use the number in that case (see $contactphone in Identifiers). |
qmsg <text> | Sends the same text to all open private chats. |
/query//msg//join//dcc send and
commands that take a nick (kick/ban/op/whois/etc.) it completes
the partial name, pressed again cycles through the alternatives. When typing a normal message, @
followed by a few letters works the same way to tag someone in the current window (e.g.
hi @ma + Tab).CTCP (Client-To-Client Protocol) is the standard IRC mechanism two clients use to exchange "service" requests outside the normal chat (client version, ping, time, etc.). Yoake implements it on IRC and, in addition, on Telegram and WhatsApp as well when BOTH sides use Yoake.
| Command | What it does |
|---|---|
ctcp <version|ping|time|clientinfo> [args] | Sends that CTCP request to the active window (a contact or a channel/group) - works identically on IRC, Telegram and WhatsApp, whether typed by hand or from a script (aliases, on events), like me above. |
Yoake also automatically replies to incoming CTCP VERSION, PING, TIME and CLIENTINFO requests (a standard IRC client-to-client protocol feature, the same thing real mIRC does) - on IRC the reply goes out as a NOTICE, never shown in the channel/query window itself (exactly like real mIRC), logged as a one-line note in Status.
/ctcp.| Command | What it does |
|---|---|
nick <new name> | Official mIRC docs (changes your nick on the IRC server) - here there's no single identity shared across networks (Telegram and WhatsApp are two separate accounts), so it really changes your name on the account of the network the window you launch it from belongs to (a real official API call: account.UpdateProfile on Telegram, updateProfileName on WhatsApp) - one network at a time, not both together with a single command. |
away <message> | Sets you away with that message (official mIRC documentation, basic_irc_commands.html). Unlike real mIRC (where the server answers on its own to anyone who writes to you), here the app sends the away message on your behalf - once per private chat while you stay away, never in groups. See $away/$awaymsg/$awaytime/$idle in Identifiers. |
away | Without a message: removes the away state (it's not a toggle, that's specifically how real mIRC works too). |
ignore <nick> | That nick's messages disappear entirely, in no chat - a GLOBAL list by name (case-insensitive), not per-window and not by hostmask like real IRC (no real hosts exist here on Telegram/WhatsApp). |
unignore <nick> | Removes the nick from the ignore list. |
cnick <nick> <color> | Assigns a fixed color to a nick (official mIRC documentation, simplified version: here only by name, real mIRC also matches by hostmask/channel mode/levels - none of which exist on Telegram/WhatsApp). Applies both in the nicklist and to the name in their messages, taking priority over the normal category color. <color> can be a number 0-15 (standard mIRC palette, the same as the $chr(3) color codes) or any CSS color (name or #hex). |
cnick -r <nick> | Removes the color assigned to that nick. |
color <category> <color> | Sets from a script/command line the same color you'd pick by hand from the Colors window (official mIRC docs: /color <name> <index>, same entries as the Alt+K dialog) - applies and saves right away, like pressing OK there. <category> (case-insensitive): own, ownContent, nick, normal, system, notice, link, reply, nicklistOp, chatBg, nicklistBg, nicklistNormal, nicklistGrayed, titleText, inputText, inputBg, taskbarText. <color> like cnick: a number 0-15 or any CSS color. |
react <emoji> | Our own extension (real mIRC has no reactions): sends <emoji> as a reaction to the LAST message in the active window, on both Telegram and WhatsApp. With no argument, removes the reaction you already set. No preconfigured entry in the right-click menu: like every popup, it's only customizable via script - if you want a quick button, add it yourself in popups.ini (e.g. React ❤️:/react ❤️). In HTML mode, received reactions show up as a small badge under the message, clickable to see who reacted. |
Our own addition - real mIRC has no calls. Yoake detects when a call comes in (audio or video, both Telegram and WhatsApp) and shows it as a system message, but it's notification only: GramJS/Baileys don't implement the actual audio/video at all, you can't really answer from here - see Scripting for the full explanation.
| Command | What it does |
|---|---|
rejectcall [message] | Declines the last incoming call. With a message, it also sends it to whoever called (a normal text message, unrelated to the call itself). Meant to be used inside the on call event (see Scripting) to automatically block all calls, but also works typed by hand. |
Twitch is a network of its own, with the same multi-account/multi-channel spirit as IRC (several Twitch accounts at once, several channels per account at once) but of a different nature: it isn't a text protocol like IRC, so Yoake doesn't talk to it over a socket - it opens a real embedded browser instead (a hidden Chromium window, one per joined channel) that replicates what a real person would do on the twitch.tv website. Login, chat, the nicklist and the channel list all depend on the real Twitch site, not on a dedicated server - see Connecting for how login works.
| Command | What it does |
|---|---|
/join <channel> | Joins a Twitch channel, opening a dedicated chat window. You can be in several channels at once with the same account, exactly as on IRC - each with its own window. |
/video [channel] | Our own addition - real mIRC never had video. Opens a separate window with the Twitch player for the channel (real audio/video, not just the text chat) - a true window of its own, not a panel inside the MDI: Twitch blocks embedding its player inside a local page like Yoake's, so this loads the player the way a normal browser would. If you have a Twitch account connected, you can also type in chat from that same window, not just watch. Without an argument, it uses the current window's channel if it's a Twitch channel. |
msg <nick> <text> / query <nick> | Sends/opens a whisper (Twitch's private message) - same syntax as the other networks. Unlike channels (no history, like IRC), whispers DO have real history, pulled from Twitch's own messages panel. |
Our own addition - real mIRC has nothing equivalent (there's no concept of "status" on IRC).
| Command | What it does |
|---|---|
status <text> | Posts a Status/Story (disappears after 24h, like in the official clients) on the active window's network - NEVER on both at once. On WhatsApp <text> alone is enough - text-only Status on a colored background, natively supported; a link inside the text stays clickable text, it doesn't generate a thumbnail preview (WhatsApp doesn't do that from its own official client via automation either). On Telegram a Story ALWAYS requires media (no text-only Story exists in the official API): the command opens the file picker like dcc send, and <text> becomes the caption. |
statuswa <text> / statustele <text> | Like status, but forces WhatsApp or Telegram respectively regardless of the active window - handy to post on a specific network without first switching to one of its windows. |
Right-click a photo or video open in the viewer: two options, "Save as..." (opens the file picker, you choose where) or "Save to default folder" (saves right away, no questions asked, like real mIRC does with received DCC files). There's no risk of overwriting a file with the same name: if one already exists, a number in parentheses is added.
| Command | What it does |
|---|---|
mediadir <path> | Sets the default folder for "Save to default folder" - our own addition (real mIRC only has an equivalent setting in the Options window, not a scriptable command). |
mediadir | Without an argument: shows the currently set folder (see also $mediadir in Identifiers). |
Our own addition - real mIRC has no concept of stickers. In the viewer, right-click an incoming image or sticker and pick "Save as sticker": it works on any image, not only on a real incoming sticker (like the official clients' "convert to sticker"). Ctrl+K for stickers is Ctrl+S: it opens the list of saved stickers right above the text box of any window (the same spot as the emoji picker) - a click sends one straight to the open chat (it doesn't insert it into the text, same as clicking a sticker in the official clients), the cross in the top-right corner of each one deletes it from the list.
Download whole set (Telegram only) - same right-click in the viewer, but only on a real incoming sticker that belongs to a pack: downloads and saves every sticker in that set in one go (like the real Telegram client does), ready in the Ctrl+S list. On a "loose" sticker (no real pack) or a plain photo the option doesn't even show up.
Our own addition - real mIRC never had video, so it has nothing equivalent. Designed for a script that wants to walk through a channel/group looking for videos (e.g. a channel with a series' episodes) and play them in sequence, moving to the next one on its own when one finishes.
| Command | What it does |
|---|---|
playmedia <channel> <id> | Opens (downloading it if needed) the media of the message with that id - like a double click on its label in text mode. Photos open as an image, videos start autoplaying. <channel> can be the name (with or without #) or the window id ($wid). The message id is read with $msg().id, see Identifiers. |
See $msg() in Identifiers and functions to walk through a
channel's messages, and the on videoend event in Scripting (fires on its own
when a video finishes playing) for a complete automatic-playlist example.
Our own addition - real mIRC always sends DCC files to a single nick chosen by hand in the command, it has no real "forward". Every photo/video/audio/document in chat has a 🔁 Share button right below it (in text mode it only appears after opening it at least once, since there's no preview there) - it opens a window with a search field and the list of contacts (with phone number, if available) and groups/channels of both networks currently connected, not just the source one: click one to share right away.
If source and recipient are on the same network, sharing uses that network's native forward (the same mechanism as "Forward" in the official client): the server copies/reuses the message it already has, without the file passing through here again - faster, and for the recipient it shows up as a real forward (on Telegram with the "Forwarded from" label). Only when source and destination are on different networks (e.g. a video seen on Telegram, sent to a WhatsApp contact) is the file downloaded and re-sent as a new upload on your behalf - the only possible way in that case, since neither network can forward to the other. The same download-and-resend path also kicks in on the same network if the native forward fails (e.g. media too old, the original reference is no longer available).
Every media item in text mode also has a unique number right in its label, e.g. [video33] -
used by the share command to share it without the mouse:
| Command | What it does |
|---|---|
share <nick|number|#channel> <tag> | Shares the media with that tag (e.g. video33, read from its label in chat) with that recipient - a person OR a group/channel, on any connected network (handy to resend to a group a video received in a private query). The target is looked up first in the current window's nicklist (like /msg), then among the contacts and channels/groups of both connected networks, by name or phone number. Accepts the nick both with and without the leading @, and the channel both with and without #: share @danilo video33, share danilo video33, share 393401234567 video33, share #mychannel video33. |
/share @dan + Tab completes the name from your contacts, just like for /query//msg.Official mIRC documentation (mirc_commands.html). Identical syntax to real mIRC, with one important
architectural difference: in real mIRC you can have many separate .mrc files, each with its own position in a
"Scripts" list; here instead aliases/events/popups all already live in a single shared space (the same reason
why, as documented elsewhere, an alias written in Remote works identically to one written on the Aliases tab). As a
result:
-a2, -rs3, ...) is accepted for syntax compatibility but ignored.on start in two different files), the last one loaded overwrites the previous one - the exact same rule that already applies today within a single file./load triggers on load but not on start (real mIRC fires both): on start is a single global event, having it fire again on every /load would create an infinite recursion in the most natural use case ("on start { load -rs extra.mrc }" to load something extra at startup) - discovered precisely while testing this feature.-ru (users file) has no equivalent: there's no concept of an IRC user list/access levels in this app.-pm (popup menu bar) correctly loads the data, but the "menubar" context isn't wired to a real visible menu in the interface yet (pre-existing limitation, not specific to /load).| Command | What it does |
|---|---|
load -a <file> | Loads an alias file, adding them to those already present (doesn't replace them). |
load -rs <file> | Loads a script file (on ... events + aliases + dialog tables). |
load -rv <file> | Loads a %variables file, adding them to those already present. |
load -ps / -pc / -pq / -pn / -pm <file> | Loads a popup for the status/channel/query/nicklist/menubar context - adds the entries to those already present in that context. The file can have the [context] header or just be bare popup lines (the switch already tells the context). |
unload -a / -rs / -rv / -ps/-pc/-pq/-pn/-pm <file> | Unloads exactly what that file had added (and only that - it doesn't touch aliases/events/variables with the same name defined elsewhere). Triggers on unload, unless you add n to the switch (e.g. -nrs) to skip it. |
reload -a/-rs/-rv/-ps/-pc/-pq/-pn/-pm <file> | Like load, but doesn't trigger on load (nor on start, for the reason above) - if the file was already loaded, reloads it from scratch in place of the previous one. |
Loading the same file twice with load updates it in place (like real mIRC) instead of leaving a duplicate. Files loaded with /load stay loaded even after restarting the app (re-read from Yoake.ini, just like real mIRC remembers its Scripts list), /unload removes them from there too.
; load an extra alias package at startup
on start {
load -rs C:\Yoake\scripts\extra.mrc
}
; ...later, to remove it:
unload -rs C:\Yoake\scripts\extra.mrc
| Command | What it does |
|---|---|
clearall | Clears all windows. |
partall | Leaves all groups/channels (asks for confirmation). |
hop | As in real mIRC: leaves and immediately rejoins the same channel/group. Only works where it's technically possible to rejoin on your own: on Telegram you need to be admin of a private channel/group (for public ones, with a username, just rejoining by name is enough); on WhatsApp you need to be admin of the group. In both cases the invite link is retrieved BEFORE leaving, so there's no risk of being locked out. On WhatsApp in particular the automatic rejoin can still be refused by WhatsApp itself (a "forbidden" error) even as admin - looks like an anti-abuse measure on the server's side against leaving and immediately rejoining with the same link: if it happens, the group is still reachable by manually rejoining with the same invite link after a few minutes. On IRC it's the real HOP command (a PART followed by a JOIN on the same channel) - always possible by definition, no need to be an op, unlike the Telegram/WhatsApp cases above. |
close [-a|-c|-cn|-m] [window] | Without a switch closes the given window (or the current/active one if none given) - handy in a nicklist popup to close the channel/query it was opened from. With a switch closes by category, all at once: -a all open chats (queries + groups/channels, never Status), -c all groups/channels, -cn all groups/channels except the active one, -m all queries (private chats) - never groups/channels. Real mIRC's -k/-s/-n switches (DCC chat/send, notice) have no equivalent here, they're ignored. |
titlebar <text> | Adds <text> after "Yoake -" in the main window's title; without text goes back to the default "Yoake". Saved in Yoake.ini (like real mIRC) - stays set even after a restart, until you change it again or clear it. Also editable from File > Options ("Titlebar Text" field), for anyone who doesn't want to use the command. |
background [-abeshcfnrtx] [path] | Background image of a window - official mIRC syntax: -a active window (default with no switch), -m main window (desktop), -s status, -h switchbar/taskbar, -e sets as default for new windows, -c/-f/-n/-r/-t style (center/fill/normal/stretch/tile), -x removes it. Without a path opens the file picker. Real mIRC's -d/-p/-l/-u/-b switches have no equivalent here, they're ignored. |
findtext [-nhc] <text> | Searches <text> among the messages of the window you run it from - official mIRC syntax, same search as Ctrl+F ("mIRC Find Text"). -n searches down (towards more recent messages) instead of up, the default. -h highlights the found line, -c clears any existing highlight (on its own, without searching anything, if not followed by text). |
proxy on <server> <port> [user] [password] [-m4|-m5] | Sets a SOCKS4/SOCKS5 proxy (official mIRC documentation, simplified version: no -c/-d switches, there's no real separate DCC to route here). Without -m4/-m5 it uses SOCKS5. Applies to both Telegram and WhatsApp together (a single proxy, not one per network), from the NEXT connection onward - it doesn't force an immediate reconnection. No generic HTTP proxy (SOCKS4/SOCKS5 only). Also editable from the "⚙ Proxy" button in the Connect window. |
proxy off | Disables the proxy (from the next connection onward). |
stats [today|30|all] | Opens the Statistics window (same as the 📊 button in the toolbar): who you talk to the most and who views your Status/Stories the most, on both networks together. Without an argument shows the last 30 days. Status/Story views are only recorded from when this feature has been active onward (they disappear with the story itself after 24h, not recoverable afterward) - on WhatsApp it isn't guaranteed that view data arrives (no official documentation confirms it). The "Online time per network" chart further down also includes every connected IRC server, each with its own bar, not just Telegram/WhatsApp. |
Command specific to Yoake, not real mIRC.
| Command | What it does |
|---|---|
update | Checks right away whether a new version is available (instead of waiting for the automatic check, every 6 hours). On Windows and Linux, if it finds an update it downloads it on its own in the background and notifies you in Status when it's ready. On macOS the app isn't signed by Apple: if automatic updating fails because of that, Yoake reports it and points to yoake.it to download the latest version manually. |
update install | Restarts Yoake and installs an already-downloaded update (never automatic: only on this explicit command). |
| Command | What it does |
|---|---|
dcc send <nick|number> [path] | Sends a file privately to that nick, with a progress window - without a path opens the file picker. Target resolved like msg above: nicklist, then address book by number/id or by name if unique. On IRC this is a real DCC SEND (official mIRC/DCC documentation, direct socket) - see the DCC section below for details. |
splay [file] | Plays a sound - without a path opens the file picker. |
play [-c] <#channel|nick|number> <file> [delay ms] | Official mIRC documentation: sends a text file line by line to the target, with a delay (in milliseconds) between lines - the classic way to send ASCII art to a channel. -c: each line is a real command to run, not text to send. Target resolved like msg/dcc send above (the name of an already-open channel/group/query, e.g. with $chan/$active, or nicklist/address book for a private one) - if it's a contact never opened before, the query opens on its own. The other official switches (-p/-q/-r/-l/-t) aren't implemented, only the base case. |
play <target> stop | Official mIRC documentation: stops the /play in progress on that target. |
query/whois (official mIRC documentation) resolve the target with the same
scheme as msg and dcc send above: first the current window's nicklist, then the
address book by number/id (always unique) or by name, but only if the name is unique - a duplicate name in the
address book gives a warning instead of guessing, use the number in that case. On IRC, whois sends
the real WHOIS request to the server: the result always appears in the Status window by default, as in real
mIRC (WHOIS replies go there unless a custom script redirects them elsewhere with on whois, see
Scripting), not in the window you typed it from./play at a very low/zero delay carries the same spam risk
discussed for a bulk send (see $contact/$contactphone in
Identifiers) - here it's a single target, not the whole address book, but with
large files the risk isn't zero either.-c, each line is sent in monospace (a
MessageEntityCode entity on Telegram, ```text``` on WhatsApp) - real mIRC is always
fixed-width, but the official Telegram/WhatsApp clients use a proportional font for normal text, which would
break the column alignment of an ASCII drawing.Besides dcc send above (file transfer, official mIRC/DCC documentation), Yoake also supports real
DCC CHAT: a direct chat over a TCP socket between two machines, which once established no longer goes
through the server. On IRC it's the real, historical protocol, compatible with any other real IRC client (mIRC,
HexChat, irssi...); on Telegram/WhatsApp the exact same socket is reused, but the invite travels "disguised" as a
normal message (the same trick already used by /ctcp above), plus a security token, since there's no
pre-existing trust model there like on IRC - it therefore only works Yoake-to-Yoake, never toward a contact's
official client.
| Command | What it does |
|---|---|
dcc chat [nick] | Proposes a DCC chat. On IRC the nick is optional if you're already in a private query with that person (it uses the current window's nick); on Telegram/WhatsApp there's no concept of a nick, the invite always goes to the currently open private chat. |
dcc accept [nick] | Accepts a pending incoming DCC chat invite (flagged with a notice in Status on IRC, or in the private chat itself on Telegram/WhatsApp) - the nick is optional if there's only one pending request. |
dcc close | Closes the active DCC chat in the current window. |
An accepted DCC chat becomes its own small window, with the same interface as a normal chat (no nicklist, it's a connection between just two parties). For the address to use in the invite, Yoake defaults to preferring a public IPv6 address if the machine has one (no NAT to traverse - it works from many mobile connections nowadays too); if there isn't one, it falls back to a local IPv4 address, warning that it's probably only reachable on the same local network unless you've manually forwarded a port on your router.
DCC SEND on IRC. dcc send (see the "Files and sounds" table above) now also works on IRC -
previously it wasn't available at all on this network. Same syntax and the same progress window already used for
Telegram/WhatsApp, but with a real, byte-accurate percentage (real DCC, direct socket): unlike WhatsApp,
whose progress bar is an indeterminate animation because Baileys doesn't expose incremental upload progress, on
IRC the number shown is therefore more accurate. Same IPv6/IPv4 choice and the same NAT warning as the DCC chat
above.
Stickers and images in IRC channels. Sending a saved sticker/image while a CHANNEL window is active
(not a private query, which uses the normal dcc send above) goes through a different, purpose-built
mechanism: real DCC is always 1-to-1, it can't "broadcast" to an entire channel - not even real mIRC can do that,
it's a protocol-level limitation, not a Yoake gap. Instead, Yoake sends a single CTCP announcement (our own
invention, not a real DCC subtype) to the channel, with a session id, address, port, filename and size: the IRC
server relays it to everyone inside on its own, for free, like any normal channel message. A real IRC client that
isn't Yoake silently ignores it, like any other CTCP it doesn't recognize - it never sees the image. Any Yoake
client in the channel that does recognize it connects DIRECTLY to the sender (the image bytes never pass through
the server) and downloads it automatically, no "accept" step needed: it appears in the channel like a normal
sticker, exactly as on Telegram/WhatsApp. Size limit: 200KB - anything larger is rejected with a warning
instead of being sent anyway or flooding the channel.
As in real mIRC, used to read/write text files inside scripts (aliases, events) - not commands meant for
interactive use in chat, a bit like timer. Each opened file is given a name of your
choice (<handle>), later used to refer to that file until you close it.
| Command | What it does |
|---|---|
fopen [-no] <handle> <path> | Opens a file and assigns it <handle>. Without a switch the file must already exist (otherwise it fails and $ferr becomes true); -n creates it if missing; -o always creates/empties it, even if it already existed. |
fclose <handle> | Closes the handle. Unlike real mIRC it doesn't accept wildcards to close more than one at once. |
fwrite [-n] <handle> <text> | Appends <text> to the end of the file (append). -n also adds a newline after the text. |
See also Identifiers and functions for $fread(), $fgetc(),
$feof and $ferr, used to read the content of an open handle.
/flist, /fseek and its switches, the
$fopen(handle).property syntax, and binary variables &binvar
(-b/-x switches) are not supported. An open handle keeps the whole file in memory with a
read pointer, not a real low-level access - fine for normal-sized text files, not huge ones.As in real mIRC, they work byte by byte instead of by text lines (unlike fopen/
fwrite above). The data lives in binary variables &name (byte arrays 0-255),
distinct from normal text %variables - they stay until you do bunset.
| Command | What it does |
|---|---|
bread [-t] <file> <S> <N> <&binvar> | Reads N bytes starting at position S in the file (S starts at zero) and puts them in &binvar. -t stops at the first newline found. |
bwrite <file> <S> <N> <text|%var|&binvar> | Writes N bytes (of the given data) to the file starting at position S (0 = start of file, -1 = at the end/append). N=-1 = writes all the given data. Unlike real mIRC, N is always required. |
bset [-z] <&binvar> <N> [value ...] | Sets the Nth byte (and the following ones, if you give more values) of &binvar - N starts at 1, like $bvar. If &binvar doesn't exist, it's created. -z clears/zeroes it first. |
bunset <&binvar> [&binvar ...] | Removes one or more binary variables. |
bcopy [-z] <&dest> <N> <&src> <S> <M> | Copies M bytes from &src (starting at byte S) into &dest (starting at byte N) - N and S start at 1. -z zeroes out the just-copied bytes in the source. |
breplace <&binvar> <old> <new> [old new ...] | Replaces every byte with value "old" (0-255) with "new", wherever it appears in &binvar. |
btrunc <file> <bytes> | Shortens or lengthens (zero-padded) the file to the given length. |
See also Identifiers and functions for $bvar() and $bfind(),
which read the content of a binary variable.
-a (UTF-8 encoding) and -c
(file chop) switches have no equivalent, ignored if used. Paths with spaces aren't supported by these commands
(unlike fopen/fwrite, which support them in the file name). Unlike real mIRC, &binvar
variables aren't automatically destroyed at the end of a script - they stay in memory until an explicit
bunset or the app closes.As in real mIRC, they let a script talk directly to an external TCP server (or receive data from one),
independently of Telegram/WhatsApp - not commands meant for interactive use in chat, like fopen
above. Each connection is given a name of your choice (<name>), later used to refer to that socket.
| Command | What it does |
|---|---|
sockopen [-e] <name> <address> <port> | Starts a TCP connection to address:port - returns right away, doesn't wait for it to actually connect. -e uses TLS/SSL (for services like HTTPS). The outcome arrives later via on sockopen (success) or on sockclose with $sockerr set (failure). |
sockwrite [-n] <name> <text> | Sends <text> on the socket. -n adds a newline ($crlf) at the end if not already present. |
sockread [-f] <%var> | To be used inside on sockread: reads a line that already arrived (up to the first newline, which is stripped) on the socket that triggered the event, and puts it in %var. -f takes everything in the buffer even without a newline. Call sockread in a loop until $sockbr returns 0 to drain everything that arrived. |
sockclose <name> | Closes the connection. |
sockmark <name> [text] | Sets (or clears, if omitted) that socket's .mark field - a free-form label, handy to remember what that connection is for. |
socklisten <name> <port> | Puts <name> in listening mode on that port, to act as a server. Every incoming connection triggers on socklisten - accept it with sockaccept. |
sockaccept <newname> | To be used inside on socklisten: accepts the pending connection on the current listener ($sockname) and turns it into a real socket called <newname> (can be the same as the listener's name, or different) - from then on use sockwrite/sockread/sockclose on <newname> like for any other socket. The listener keeps listening for further connections. |
See also Identifiers and functions for $sock(), and
Available events for on sockopen/on sockread/on sockclose/on socklisten.
sockudp (UDP). -e gives a
basic TLS connection (no certificate checking); real mIRC's advanced switches for handling
certificates (-s/-w/-a/-p), STARTTLS and UPnP have no equivalent.
A single global handler for on sockopen/on sockread/on sockclose/on socklisten
(not one per socket name): use $sockname inside the event to know which connection triggered it,
if you have more than one open. A listener accepts one pending connection at a time: if a second one arrives before
the script calls sockaccept on the first, the old one is discarded.| Command | What it does |
|---|---|
run <program> [arguments...] | Starts an external program - returns immediately, doesn't wait for it to finish and doesn't block the interface (official mIRC docs). An argument in quotes stays a single argument even if it contains spaces (e.g. a prompt). When the program exits, on run fires with the captured output. |
/run NEVER returns the program's output
(verified on the official forums) - it's just "start the program". Here instead the output (text and exit code) is
captured and made available to the script via on run (see
Available events) and the identifiers $runoutput/$runerror/
$runcode (see Identifiers and functions) - meant for querying a
command-line program from a script (e.g. an AI installed as a local CLI). A single global "last run": if you launch
several /run calls without waiting for the first to finish, there's no way to tell which process just
exited - fine as long as you launch one at a time.| Command | What it does |
|---|---|
timer<N> <repeats> <seconds> <command> | Runs <command> every N seconds; 0 repeats = forever. timer<N> off stops it, timers off stops all of them. |
beep [times] [seconds] | Emits a beep sound. |
flash [off] | Makes the window/icon flash in the system taskbar; flash off stops it. |
| Command | What it does |
|---|---|
set %var <value> | Sets a variable. |
inc %var / dec %var | Increments/decrements a numeric variable. |
goto <label> | Jumps to :label (only within the same nesting level). |
return | Exits the current block. |
halt | Stops the script AND prevents the message from being shown in chat (only inside "on message"). |
haltdef | Only prevents the default action (message or notification) from being shown, the script continues. |
Flow control as in real mIRC - no "for" (doesn't exist there either), only if/elseif/
else/while/goto. if and elseif accept both the classic
multi-line block with braces, and a single command on one line with no braces (classic mIRC style):
if (a == b) { ... }
elseif (a == c) { ... }
else { ... }
if (%nick == $null) goto done ; no braces: a single command, the whole line
if (a == b) { ... } elseif (a == c) { ... } else { ... } ; "} elseif (...) {" on the same line is fine
while (a < b) { ... } (max 10000 iterations, then stops on its own)
:label ... goto label
| - real mIRC would use | to separate multiple commands on the same
line, but here | isn't supported as a command separator (not just inside if, in general).Operators (official mIRC documentation, "If-then-else statements" section):
| Operator | What it does |
|---|---|
== / != | Equal / not equal, case-insensitive. |
=== | Equal, case-sensitive (there's no !==, for that just use !(a === b)). |
< > <= >= | Numeric comparison if both sides are numbers, otherwise alphabetic (case-insensitive). |
isin / isincs | v1 is contained in v2, without/with case sensitivity. |
iswm / iswmcs | v1 matches the wildcard pattern */? in v2, without/with case sensitivity. |
isnum [v2] | v1 is a number; with v2 in the format N-M, also checks it's within that range. |
isalpha / isalnum | v1 contains only letters / only letters and numbers. |
isletter [v2] | v1 is made only of letters; with v2, also checks that every letter of v1 appears in v2. |
isop v2 | v1 is admin of the group/channel v2 (based on the nicklist already tracked for Telegram and WhatsApp). |
ischan | v1 is the name of a group/channel currently open. |
// / \\ | v2 is / isn't a multiple of v1. |
& | Bitwise comparison: true if v1 AND v2 (bit by bit) is nonzero. |
&& / || / ! | Logical AND / logical OR / negation. |
As in real mIRC, every word operator (isin, isnum, isop, etc.) can be
negated by putting a ! in front of it, e.g. if (%x !isin %list).
ison, ishop, isvoice, isreg, isban, isinvite,
isexcept, isaop, isavoice, isignore, isprotect,
isnotify - all tied to channel lists (ban/invite/auto-op/ignore/etc.) that don't exist here.See also Identifiers and functions for $nick, $chan, $1-$9 and the
$len()/$calc()/etc. functions usable inside any command, and Dialogs for /dialog
and /did (custom windows with buttons, text boxes, lists, tabs and menus).