This is a fork of the original Sulci bot by Ermine to maintain it in a more or less buildable and runnable condition inside Docker containers. Some of its original functionality that was dependent on external resources has ceased to work, but it is still usable as a foul language moderator and fun conversationalist.
- Create directories for storing config files, databases, and logs, then mount
them to the container according to the
docker-compose.ymlexample. - Copy
sulci-docker.conf.exampleto the configs folder created above assulci.confand edit it to your needs. - Run the container once to initialize databases.
- Edit
sulci_muc.dbmanually to set up MUC auto-join with any sqlite3 capable database editing tool like DB Browser for SQLite.
Refer to Dockerfile for building procedures in case of a wish of running
the bot outside of docker container.
- Added handling of external HTTPS requests.
- Added the netunidata.other dependency to correctly load the Mueller KOI8-R dictionary.
- Fixed loading DICT server settings from config.
- Fixed missing .hostip command.
- Disabled Google, Yandex, and Translate plugins, as their respective service APIs were changed or deprecated.
Provides basic admin commands.
-
.msg <jid> <message>
Sends a message to a specified JID. Botmaster only.
Example:.msg user@example.com Hoi! -
.quit
Shuts down the bot gracefully. Botmaster only. -
.lang_update <lang>
Updates the bot's language setting. Botmaster only. -
.lang_msgid <language> <msgid> <string>
Updates a localized message string for a specific message ID. Botmaster only.
Example:.lang_msgid ru plugin_cerberus_cannot_kick_admin не болтай глупостей как малолетка! -
.sh <cmd>
Executes a shell command on the bot's host machine. Botmaster only. Dangerous. Disabled by default.
Example:.sh ls -la /
Managing Multi-User Chat (MUC) rooms.
-
.msg <jid> <message>
Sends a message to a specific JID or room. Botmaster only.
Example:.msg room@conference.example.com Hello! -
.join <room> [nick]
Joins a MUC room with an optional nickname. Botmaster only.
Example:.join room@conference.example.com mynick -
.leave <room> [reason]
Leaves a MUC room with an optional reason. Botmaster only.
Example:.leave room@conference.example.com Goodbye! -
.invite <who> [room]
Invites a user to a room. If no room is specified, the current room is used. Botmaster only.
Example:.invite user@example.com room@conference.example.com -
.nick <new_nick>
Changes the bot's nickname in the current room. Botmaster only.
Example:.nick newnick
Brainfuck interpreter.
.bf <brainfuck_code>
Runs Brainfuck interpreter. ([ and ] do not work).
Example:.bf +++>++.
Calculator.
-
.calc <expression>
A general-purpose calculator that evaluates mathematical expressions.
Example:.calc 2 + 3 * (4 - 1) -
.rpn <RPN_expression>
A calculator that evaluates mathematical expressions written in Reverse Polish Notation (RPN) format.
Example:.rpn 2 3 4 1 - * +
Currency converter.
-
.curr listDisplays the current list of currency exchange rates fetched from the Central Bank of Russia (CBR). Rates are updated daily. -
.curr refreshForces a refresh of currency exchange rates by fetching the latest data from the Central Bank of Russia (CBR). -
.curr <amount> <from_currency> <to_currency>Converts an amount from one currency to another using the latest exchange rates.
Example:.curr 100 USD EUR
Queries dictionary definitions from a DICT protocol server.
-
.dict <word>
Looks up the definition of a single word in the default dictionary database.
Example:.dict hello -
.dict <database> <word>
Looks up the definition of a word in a specific dictionary database.
Example:.dict wn hello -
.dict -list
Lists all available dictionary databases on the server. -
.dict * <word>
Looks up the definition of a word across all available databases.
Example:.dict * hello
Integrates Google services.
-
.google <search query>
Performs a Google search and returns the first result.
Example:.google "OCaml programming language" -
.translate <source_language> <target_language> <text>
Translates text using Google Translate.
Example:.translate en fr "Hello, how are you?"
Intergrates HostIP.info API.
.hostip <ip_or_hostname>
Retrieves the geographic location of the provided IP address or hostname.
Example:.hostip 8.8.8.8
Miscellaneous utility commands.
.dns <domain/ip>
Resolves a domain name to its IP address or performs a reverse DNS lookup for an IP address.
Examples:
.dns example.com
.dns 8.8.8.8
Searching and translating words using the Mueller dictionary.
.mueller <word>
Searches for a word in the Mueller dictionary and returns its definition.
Example:.mueller hello
Measures the round-trip time.
.ping <entity>
Measures the round-trip time to the specified XMPP entity.
Example:.ping user@example.com
Provides information about top-level domains (TLDs) by querying a database.
-
.tld <domain>
Returns information about the specified top-level domain.
Example:.tld com -
.tld *
Provides a link to the IANA website listing all country code TLDs.
Example:.tld *
Uses the m.translate.ru service to translate text between various language pairs.
-
.tr list
Lists all available language pairs for translation.
Example:.tr list -
.tr [lang] [text]
Translates text between specified language pair.
Example:.tr er Hello(translates "Hello" from English to Russian)
Queries user and server details like version, time, idle status, uptime, and statistics.
-
.version
Get client or server version details. -
.time
Get current time for user or server. -
.idle
Check user's idle time. -
.uptime
Get server or user uptime. -
.stats
View server statistics (e.g., online/total users).
vCard information.
.vcard [jid]
Retrieves and displays vCard information for a specified XMPP entity.
Example:.vcard user@example.com
Manages vocabulary database.
-
.dfn <key=[value]>
Defines or updates a term. If the term exists, it will be replaced. If the value is empty, the term is removed.
Example:.dfn ocaml=awesome -
.wtf <key>
Retrieves the definition of a specific term.
Example:.wtf ocaml -
.wtfall <key>
Retrieves all definitions for a specific term.
Example:.wtfall ocaml -
.wtfrand
Retrieves a random term and its definition. -
.wtfcount [key]
Counts the number of definitions for a term. If no key is provided, it returns the total number of terms.
Example:.wtfcount ocaml -
.wtffind <text>
Searches for terms or definitions containing the specified text.
Example:.wtffind awesome -
.wtfremove <key[=value]>
Removes a specific definition for a term. If no value is provided, all definitions for the key are removed. Moderators only.
Example:.wtfremove ocaml=awesome
Displays weather.
.wz <code>
Fetches weather data for a given 4-letter airport code.
Example:.wz ULLI(fetches weather for Pulkovo Airport, St. Petersburg)
Integrations with Yandex services.
Commands:
.blogs <query>
Searches for blog posts on Yandex Blogs.
Example:.blogs OCaml programming
Generates Markov chains from chat messages, storing word pairs in an SQLite database. It can generate random text based on learned patterns and provide statistics about the stored data.
-
.!!!count
Returns the total number of word pairs stored in the Markov database. -
.!!!top
Displays the top word pairs with their occurrence counts.
Implements a Russian roulette-style game in MUC rooms, where participants can be randomly kicked from the room.
.tryme
Initiates a roulette game. If the user is not a moderator, they have a 1 in 10 chance of being kicked from the room.
Tracks and analyzes user activity in chat rooms, storing statistics about words spoken, sentences, and actions.
-
.talkers
Displays statistics about top talkers in the current room. -
.talkers <nick>
Displays statistics for a specific user in the current room.
Example:.talkers username
The original bot's code is by Anastasia Gornostaeva.