Events
The Events system lets mods listen to 60+ game events and emit custom cross-mod events.
Global Events
Use the Events namespace for mod-level event listening:
import { Events } from "@hotbunny/hackhub-content-sdk";
Events.on("Terminal.NmapScan", (data) => {
console.log(`Player scanned ${data.ip}`);
});Events.on() returns an unsubscribe function:
const unsub = Events.on("Terminal.Ping", (data) => {
console.log(`Pinged ${data.ip}`);
});
// later...
unsub();Quest-Scoped Events
Inside quests, always use this.Events instead of the global Events. Listeners registered through this.Events are automatically cleaned up when the quest completes or is abandoned.
Register them in OnObjectivesStart() (runs on every game start), not OnStart() (runs once at claim) — listeners are lost on reload and only OnObjectivesStart() re-attaches them.
@RegisterQuest
class MyQuest extends Quest {
// ...
// Runs on claim and on every game start, so listeners survive reloads.
OnObjectivesStart() {
this.Events.on("Terminal.NmapScan", (data) => {
// re-attached on every game start;
// automatically removed on complete/abandon
});
}
}See the Quests guide for more details.
Custom Events
Emit and listen to custom events for cross-mod communication:
Events.emit("MyMod.ScoreUpdated", { score: 100 });
Events.on("MyMod.ScoreUpdated", (data) => {
console.log(`Score: ${data.score}`);
});You can optionally register event names for discoverability:
Events.register("MyMod.ScoreUpdated");Game Events Reference
Terminal
| Event | Payload |
|---|---|
Terminal.NmapScan | { ip, ports } |
Terminal.Nslookup | { domain, ip } |
Terminal.Ping | { ip } |
Terminal.Command | { command, args } |
Terminal.InstallPackage | { name } |
Terminal.SSH.Connected | string (connected server IP) |
Terminal.SSH.Disconnected | string (disconnected server IP) |
Terminal.SSH.FileDownload | { ip, filename } |
Terminal.Cd | { path } |
Terminal.Ls | { path } |
Terminal.Openssl | { file } |
Terminal.SSH.Shutdown | { ip } |
Terminal.Lynx.Search | { query } |
Terminal.Lynx.Lookup | { query, results } |
Terminal.Mxlookup | { domain } |
Terminal.Ifconfig | { } |
Network & Scanning
| Event | Payload |
|---|---|
Terminal.Hydra | { ip, username, password } |
Terminal.Whois | { domain } |
Terminal.FTP.Connect | { ip } |
Terminal.Dig | { domain } |
Terminal.Dirhunter | { ip, directories } |
Terminal.Geoip | { ip } |
Terminal.Cat | { filename } |
Subfinder.Results | { domain, subdomains } |
Nuclei.Results | { target, vulnerabilities } |
Exploitation
| Event | Payload |
|---|---|
Metasploit.Msfconsole | { } |
Metasploit.Search | { query } |
Metasploit.Use | { module } |
Metasploit.ShowOptions | { module } |
Metasploit.SetOption | { key, value } |
Metasploit.Event | { type } |
Metasploit.Rootgrab | { ip } |
Meterpreter.Connected | { ip } |
Meterpreter.Download | { ip, file } |
Hashcat.Event | { hash } |
John.Decrypt.Hash | { hash } |
Fern.FindPassword | { ssid, password } |
Bettercap
| Event | Payload |
|---|---|
Bettercap.Open | { } |
Bettercap.Close | { } |
Bettercap.NetProbe | { } |
Bettercap.NetShow | { devices } |
Bettercap.WifiRecon | { networks } |
Bettercap.WifiDeAuth | { ssid } |
Files & Browser
| Event | Payload |
|---|---|
Files.Open | { filename } |
Files.Transfer | { filename, direction } |
Files.Deleted | { filename } |
Explorer.Event | { path } |
Browser.WebsiteOpened | { siteName, url } |
Browser.Meta | parsed URL: { href, protocol, slashes, auth, username, password, host, hostname, port, pathname, query, hash, origin } |
Communication
| Event | Payload |
|---|---|
Mail.Received | { from, subject } |
Mail.Read | { id } |
Mail.Mailbox.Opened | { } |
Mail.Account.Created | { email } |
Mail.Account.LoggedIn | { email } |
Social
| Event | Payload |
|---|---|
Twotter.Account.Created | { username } |
Twotter.Account.Login | { username } |
Twotter.Account.Logout | { username } |
Twotter.Post.Seen | { postId } |
Twotter.Post | { content } |
Twotter.Profile.Seen | { username } |
Kisscord.FriendAdded | { userId } |
Kisscord.Messaging | { contactId } |
WeeChat.Connected | { host } |
WeeChat.Disconnected | { host } |
WeeChat.Message | { host, content } |
Other
| Event | Payload |
|---|---|
Bank.Transfer | { amount, from, to } |
Bank.Account.Created | { iban } |
Bank.Logout | { } |
Quest.Claimed | { questName } |
Database.Connected | { ip } |
Database.DataUpdate | { table } |
Sqlmap.ListTables | { ip, tables } |
Sqlmap.DumpTable | { ip, table } |
Network.PortChanges | { ip, ports } |
Network.UserActivity | { ip, username } |
Network.WifiConnected | { ssid } |
PFSense.Login | { ip } |
PFSense.Changes | { ip } |
Process.Killed | { name, pid } |
Wireshark.Started | { } |
Wireshark.Stopped | { } |
Python3.ExecFile | { filename } |
BCC.News.Opened | { } |
Remote.Connection.Established | { ip } |
Remote.Connection.Disconnected | { ip } |
INFO
Requires the events permission in your manifest.json.
