tuicraft
CLI client for World of Warcraft 3.3.5a. A background daemon maintains the game connection and buffers events. The daemon starts automatically on first use and stays running for 30 minutes of inactivity.
Status
tuicraft status
Returns CONNECTED or an error. Check this before other commands.
Sending Messages
tuicraft send "message" # say (nearby players)
tuicraft send -y "message" # yell (wider range)
tuicraft send -p "message" # party chat
tuicraft send -g "message" # guild chat
tuicraft send -w PlayerName "message" # whisper to player
Slash commands work too:
tuicraft send "/raid message" # raid chat
tuicraft send "/e waves hello" # text emote
tuicraft send "/dnd busy right now" # toggle DND status
tuicraft send "/afk grabbing coffee" # toggle AFK status
tuicraft send "/roll" # roll 1-100
tuicraft send "/roll 50" # roll 1-50
tuicraft send "/roll 10 20" # roll 10-20
tuicraft send "/1 message" # channel 1
tuicraft send "/2 message" # channel 2
Reading Events
tuicraft read # buffered events since last read
tuicraft read --wait 5 # wait 5 seconds, then return events
tuicraft tail # continuous stream (blocks)
Add --json for structured output. Each JSON line:
{"type":"PARTY","sender":"PlayerName","message":"hello"}
Event Types
| Type | Meaning |
|---|---|
| SAY | Nearby /say chat |
| YELL | /yell chat |
| PARTY | Party member message |
| PARTY_LEADER | Party leader message |
| GUILD | Guild chat |
| OFFICER | Officer chat |
| RAID | Raid chat |
| RAID_LEADER | Raid leader message |
| RAID_WARNING | Raid warning |
| WHISPER | Incoming whisper |
| WHISPER_TO | Outgoing whisper confirmation |
| CHANNEL | Custom channel message |
| EMOTE | Player emote |
| SYSTEM | System messages and unimplemented packet notices |
| ENTITY_APPEAR | NPC/player/object appeared nearby (--json only) |
| ENTITY_DISAPPEAR | Entity left range (--json only) |
| ENTITY_UPDATE | Entity field changed (--json only) |
| FRIEND_ONLINE | Friend came online |
| FRIEND_OFFLINE | Friend went offline |
| FRIEND_ADDED | Friend added to list |
| FRIEND_REMOVED | Friend removed from list |
| FRIEND_ERROR | Friend operation error |
| IGNORE_ADDED | Player added to ignore list |
| IGNORE_REMOVED | Player removed from ignore list |
| IGNORE_ERROR | Ignore operation error |
| GUILD_ROSTER_UPDATED | Guild roster data received |
| GUILD_COMMAND_RESULT | Guild command error (permissions, not found) |
| GUILD_INVITE_RECEIVED | Incoming guild invitation prompt |
The channel field appears on CHANNEL events only.
Entity events include guid, objectType, name, and type-specific fields like level, health, maxHealth, x, y, z.
Who Queries
tuicraft who # all online players
tuicraft who "warrior" # filter by name/class/etc
Channel Commands
tuicraft send "/join ChannelName" # join a chat channel
tuicraft send "/leave ChannelName" # leave a chat channel
Group Commands
tuicraft send "/invite PlayerName" # invite to group
tuicraft send "/kick PlayerName" # remove from group
tuicraft send "/leave" # leave group
tuicraft send "/leader PlayerName" # transfer leadership
tuicraft send "/accept" # accept pending invite (group or duel)
tuicraft send "/decline" # decline pending invite (group or duel)
Duel events (SMSG_DUEL_REQUESTED, COUNTDOWN, COMPLETE, WINNER,
OUTOFBOUNDS, INBOUNDS) are surfaced in the event stream as [duel]
labeled messages. Use /accept or /decline to respond to incoming
duel requests.
Friends List
tuicraft send "/friends" # show friends list
tuicraft send "/friend add PlayerName" # add friend
tuicraft send "/friend remove PlayerName" # remove friend
IPC verbs:
echo "FRIENDS" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
echo "FRIENDS_JSON" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
echo "ADD_FRIEND PlayerName" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
echo "DEL_FRIEND PlayerName" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
Ignore List
tuicraft send "/ignore PlayerName" # add to ignore list
tuicraft send "/unignore PlayerName" # remove from ignore list
tuicraft send "/ignorelist" # show ignore list
Messages from ignored players are filtered from chat display and daemon read output.
IPC verbs:
echo "IGNORED" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
echo "IGNORED_JSON" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
echo "ADD_IGNORE PlayerName" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
echo "DEL_IGNORE PlayerName" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
Guild Roster
tuicraft send "/groster" # show guild roster
Displays MOTD, guild info, and all members sorted by online status. Shows rank, level, class, zone, and notes for each member.
IPC verbs:
echo "GUILD_ROSTER" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
echo "GUILD_ROSTER_JSON" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
Guild Management
tuicraft send "/ginvite PlayerName" # invite to guild
tuicraft send "/gkick PlayerName" # remove from guild
tuicraft send "/gleave" # leave guild
tuicraft send "/gpromote PlayerName" # promote member
tuicraft send "/gdemote PlayerName" # demote member
tuicraft send "/gleader PlayerName" # transfer leadership
tuicraft send "/gmotd New MOTD" # set message of the day
tuicraft send "/gaccept" # accept guild invite
tuicraft send "/gdecline" # decline guild invite
IPC verbs:
echo "GINVITE PlayerName" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
echo "GKICK PlayerName" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
echo "GLEAVE" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
echo "GPROMOTE PlayerName" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
echo "GDEMOTE PlayerName" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
echo "GLEADER PlayerName" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
echo "GMOTD New MOTD" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
echo "GACCEPT" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
echo "GDECLINE" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
Entity Queries
The daemon exposes NEARBY and NEARBY_JSON IPC verbs for querying tracked entities:
echo "NEARBY" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
echo "NEARBY_JSON" | nc -U $TMPDIR/tuicraft-$(id -u)/sock
In the TUI, toggle entity event display with /tuicraft entities on|off.
Openclaw Integration
Complete example: forward party chat to an openclaw agent, filtering out the agent's own character to prevent feedback loops. Each agent turn runs in the background so the pipeline doesn't block.
tuicraft tail --json \
| jq -r --unbuffered '
select((.type == "PARTY" or .type == "PARTY_LEADER")
and .sender != "Xia")
| "\(.sender): \(.message)"' \
| while IFS= read -r line; do
openclaw agent --agent x \
--message "$line" \
</dev/null >/dev/null 2>&1 &
done
Replace Xia with the agent's WoW character name and x with the openclaw
agent id. The agent can respond in-game with tuicraft send -p "message".
To watch different event types, change the jq select filter:
| Filter | Events |
|---|---|
.type == "WHISPER" | Incoming whispers only |
.type == "GUILD" | Guild chat only |
.type != "SYSTEM" | Everything except system noise |