'use strict'; /** * The server port - the port to run Pokemon Showdown under * * @type {number} */ exports.port = 8000; /** * The server address - the address at which Pokemon Showdown should be hosting * This should be kept set to 0.0.0.0 unless you know what you're doing. * * @type {string} */ exports.bindaddress = '0.0.0.0'; /** * workers - the number of networking child processes to spawn * This should be no greater than the number of threads available on your * server's CPU. If you're not sure how many you have, you can check from a * terminal by running: * * $ node -e "console.log(require('os').cpus().length)" * * Using more workers than there are available threads will cause performance * issues. Keeping a couple threads available for use for OS-related work and * other PS processes will likely give you the best performance, if your * server's CPU is capable of multithreading. If you don't know what any of * this means or you are unfamiliar with PS' networking code, leave this set * to 1. */ exports.workers = 1; /** * wsdeflate - compresses WebSocket messages * Toggles use of the Sec-WebSocket-Extension permessage-deflate extension. * This compresses messages sent and received over a WebSocket connection * using the zlib compression algorithm. As a caveat, message compression * may make messages take longer to procress. * @type {AnyObject?} */ exports.wsdeflate = null; /* // example: exports.wsdeflate = { level: 5, memLevel: 8, strategy: 0, noContextTakeover: true, requestNoContextTakeover: true, maxWindowBits: 15, requestMaxWindowBits: 15, }; */ /** * ssl - support WSS, allowing you to access through HTTPS * The client requires port 443, so if you use a different port here, * it will need to be forwarded to 443 through iptables rules or * something. * @type {{port: number, options: {key: string, cert: string}} | null} */ exports.ssl = null; /* // example: exports.ssl = { port: 443, options: { key: './config/ssl/privkey.pem', cert: './config/ssl/fullchain.pem', }, }; */ /* Main's SSL deploy script from Let's Encrypt looks like: cp /etc/letsencrypt/live/sim.psim.us/privkey.pem ~user/Pokemon-Showdown/config/ssl/ cp /etc/letsencrypt/live/sim.psim.us/fullchain.pem ~user/Pokemon-Showdown/config/ssl/ chown user:user ~user/Pokemon-Showdown/config/ssl/privkey.pem chown user:user ~user/Pokemon-Showdown/config/ssl/fullchain.pem */ /** * proxyip - proxy IPs with trusted X-Forwarded-For headers * This can be either false (meaning not to trust any proxies) or an array * of strings. Each string should be either an IP address or a subnet given * in CIDR notation. You should usually leave this as `false` unless you * know what you are doing * @type {false | string[]}. */ exports.proxyip = false; /** * Various debug options * * ofe[something] * ============================================================================ * * Write heapdumps if that processs run out of memory. * * If you wish to enable this, you will need to install node-oom-heapdump: * * $ npm install --no-save node-oom-heapdump * * We don't install it by default because it's super flaky and frequently * crashes the installation process. * * You might also want to signal processes to put them in debug mode, for * access to on-demand heapdumps. * * kill -s SIGUSR1 [pid] * * debug[something]processes * ============================================================================ * * Attach a `debug` property to `ProcessWrapper`, allowing you to see the last * message it received before it hit an infinite loop. * * For example: * * >> ProcessManager.processManagers[4].processes[0].debug * << "{"tar":"spe=60,all,!lc,!nfe","cmd":"dexsearch","canAll":true,"message":"/ds spe=60,all,!lc,!nfe"}" */ exports.ofemain = false; exports.ofesockets = false; exports.debugsimprocesses = true; exports.debugvalidatorprocesses = true; exports.debugdexsearchprocesses = true; /** * Pokemon of the Day - put a pokemon's name here to make it Pokemon of the Day * The PotD will always be in the #2 slot (not #1 so it won't be a lead) * in every Random Battle team. * * @type {ID} */ exports.potd = ''; /** * crash guard - write errors to log file instead of crashing * This is normally not recommended - if Node wants to crash, the * server needs to be restarted * However, most people want the server to stay online even if there is a * crash, so this option is provided */ exports.crashguard = true; /** * login server data - don't forget the http:// and the trailing slash * This is the URL of the user database and ladder mentioned earlier. * Don't change this setting - there aren't any other login servers right now */ exports.loginserver = 'http://play.pokemonshowdown.com/'; exports.loginserverkeyalgo = "RSA-SHA1"; exports.loginserverpublickeyid = 4; exports.loginserverpublickey = `-----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzfWKQXg2k8c92aiTyN37 dl76iW0aeAighgzeesdar4xZT1A9yzLpj2DgR8F8rh4R32/EVOPmX7DCf0bYWeh3 QttP0HVKKKfsncJZ9DdNtKj1vWdUTklH8oeoIZKs54dwWgnEFKzb9gxqu+z+FJoQ vPnvfjCRUPA84O4kqKSuZT2qiWMFMWNQPXl87v+8Atb+br/WXvZRyiLqIFSG+ySn Nwx6V1C8CA1lYqcPcTfmQs+2b4SzUa8Qwkr9c1tZnXlWIWj8dVvdYtlo0sZZBfAm X71Rsp2vwEleSFKV69jj+IzAfNHRRw+SADe3z6xONtrJOrp+uC/qnLNuuCfuOAgL dnUVFLX2aGH0Wb7ZkriVvarRd+3otV33A8ilNPIoPb8XyFylImYEnoviIQuv+0VW RMmQlQ6RMZNr6sf9pYMDhh2UjU11++8aUxBaso8zeSXC9hhp7mAa7OTxts1t3X57 72LqtHHEzxoyLj/QDJAsIfDmUNAq0hpkiRaXb96wTh3IyfI/Lqh+XmyJuo+S5GSs RhlSYTL4lXnj/eOa23yaqxRihS2MT9EZ7jNd3WVWlWgExIS2kVyZhL48VA6rXDqr Ko0LaPAMhcfETxlFQFutoWBRcH415A/EMXJa4FqYa9oeXWABNtKkUW0zrQ194btg Y929lRybWEiKUr+4Yw2O1W0CAwEAAQ== -----END PUBLIC KEY----- `; /** * routes - where Pokemon Showdown is hosted. * Don't change this setting - there aren't any other options right now */ exports.routes = { root: 'pokemonshowdown.com', client: 'play.pokemonshowdown.com', dex: 'dex.pokemonshowdown.com', replays: 'replay.pokemonshowdown.com', }; /** * crashguardemail - if the server has been running for more than an hour * and crashes, send an email using these settings, rather than locking down * the server. Uncomment this definition if you want to use this feature; * otherwise, all crashes will lock down the server. If you wish to enable * this setting, you will need to install nodemailer, as it is not installed * by default: * $ npm install nodemailer * @type {AnyObject?} */ exports.crashguardemail = null; /* exports.crashguardemail = { options: { host: 'mail.example.com', port: 465, secure: true, auth: { user: 'example@domain.com', pass: 'password' } }, from: 'crashlogger@example.com', to: 'admin@example.com', subject: 'Pokemon Showdown has crashed!' }; */ /** * basic name filter - removes characters used for impersonation * The basic name filter removes Unicode characters that can be used for impersonation, * like the upside-down exclamation mark (looks like an i), the Greek omicron (looks * like an o), etc. Disable only if you need one of the alphabets it disables, such as * Greek or Cyrillic. */ exports.disablebasicnamefilter = false; /** * allowrequestingties - enables the use of `/offerdraw` and `/acceptdraw` */ exports.allowrequestingties = true; /** * report joins and leaves - shows messages like " joined" * Join and leave messages are small and consolidated, so there will never * be more than one line of messages. * If this setting is set to `true`, it will override the client-side * /hidejoins configuration for users. * This feature can lag larger servers - turn this off if your server is * getting more than 80 or so users. */ exports.reportjoins = true; /** * report joins and leaves periodically - sends silent join and leave messages in batches * This setting will only be effective if `reportjoins` is set to false, and users will * only be able to see the messages if they have the /showjoins client-side setting enabled. * Set this to a positive amount of milliseconds if you want to enable this feature. */ exports.reportjoinsperiod = 0; /** * report battles - shows messages like "OU battle started" in the lobby * This feature can lag larger servers - turn this off if your server is * getting more than 160 or so users. * @type {boolean | string[] | string} */ exports.reportbattles = true; /** * report joins and leaves in battle - shows messages like " joined" in battle * Set this to false on large tournament servers where battles get a lot of joins and leaves. * Note that the feature of turning this off is deprecated. */ exports.reportbattlejoins = true; /** * notify staff when users have a certain amount of room punishments. * Setting this to a number greater than zero will notify staff for everyone with * the required amount of room punishments. * Set this to 0 to turn the monitor off. */ exports.monitorminpunishments = 3; /** * Turns off all time-based throttles - rename, challenges, laddering, etc. */ exports.nothrottle = false; /** * Removes all ip-based alt checking. */ exports.noipchecks = false; /** * controls the behavior of the /battlesearch command * * valid values are: * - true: disables battlesearch entirely * - false: enables the node.js /battlesearch * (uses either node fs or ripgrep for searching) * - 'psbattletools': defaults to the psbattletools /battlesearch (normally available as /alternatebattlesearch) * (uses psbattletools, which must be installed, for searching) * * @type {boolean | 'psbattletools'} */ exports.nobattlesearch = false; /** * allow punishmentmonitor to lock users with multiple roombans. * When set to `true`, this feature will automatically lock any users with three or more * active roombans, and notify the staff room. * Note that this requires punishmentmonitor to be enabled, and therefore requires the `monitorminpunishments` * option to be set to a number greater than zero. If `monitorminpunishments` is set to a value greater than 3, * the autolock will only apply to people who pass this threshold. */ exports.punishmentautolock = false; /** * restrict sending links to autoconfirmed users only. * If this is set to `true`, only autoconfirmed users can send links to either chatrooms or other users, except for staff members. * This option can be used if your server has trouble with spammers mass PMing links to users, or trolls sending malicious links. */ exports.restrictLinks = false; /** * whitelist - prevent users below a certain group from doing things * For the modchat settings, false will allow any user to participate, while a string * with a group symbol will restrict it to that group and above. The string * 'autoconfirmed' is also supported for chatmodchat and battlemodchat, to restrict * chat to autoconfirmed users. * This is usually intended to be used as a whitelist feature - set these to '+' and * voice every user you want whitelisted on the server. /** * chat modchat - default minimum group for speaking in chatrooms; changeable with /modchat * @type {false | string} */ exports.chatmodchat = false; /** * battle modchat - default minimum group for speaking in battles; changeable with /modchat * @type {false | AuthLevel} */ exports.battlemodchat = false; /** * PM modchat - minimum group for sending private messages or challenges to other users * @type {false | AuthLevel} */ exports.pmmodchat = false; /** * ladder modchat - minimum group for laddering * @type {false | GroupSymbol} */ exports.laddermodchat = false; /** * forced timer - force the timer on for all battles * Players will be unable to turn it off. * This setting can also be turned on with the command /forcetimer. * * @type {boolean} */ exports.forcetimer = false; /** * force register ELO - unregistered users cannot search for ladder battles * in formats where their ELO is at or above this value. * @type {false | number} */ exports.forceregisterelo = false; /** * backdoor - allows Pokemon Showdown system operators to provide technical * support for your server * This backdoor gives system operators (such as Zarel) console admin * access to your server, which allow them to provide tech support. This * can be useful in a variety of situations: if an attacker attacks your * server and you are not online, if you need help setting up your server, * etc. If you do not trust Pokemon Showdown with admin access, you should * disable this feature. */ exports.backdoor = true; /** * List of IPs and user IDs with dev console (>> and >>>) access. * The console is incredibly powerful because it allows the execution of * arbitrary commands on the local computer (as the user running the * server). If an account with the console permission were compromised, * it could possibly be used to take over the server computer. As such, * you should only specify a small range of trusted IPs and users here, * or none at all. By default, only localhost can use the dev console. * In addition to connecting from a valid IP, a user must *also* have * the `console` permission in order to use the dev console. * Setting this to an empty array ([]) will disable the dev console. */ exports.consoleips = ['127.0.0.1']; /** * Whether to watch the config file for changes. If this is enabled, * then the config.js file will be reloaded when it is changed. * This can be used to change some settings using a text editor on * the server. */ exports.watchconfig = true; /** * logchat - whether to log chat rooms. */ exports.logchat = false; /** * logchallenges - whether to log challenge battles. Useful for tournament servers. */ exports.logchallenges = false; /** * loguserstats - how often (in milliseconds) to write user stats to the * lobby log. This has no effect if `logchat` is disabled. */ exports.loguserstats = 1000 * 60 * 10; // 10 minutes /** * validatorprocesses - the number of processes to use for validating teams * simulatorprocesses - the number of processes to use for handling battles * You should leave both of these at 1 unless your server has a very large * amount of traffic (i.e. hundreds of concurrent battles). */ exports.validatorprocesses = 1; exports.simulatorprocesses = 1; /** * inactiveuserthreshold - how long a user must be inactive before being pruned * from the `users` array. The default is 1 hour. */ exports.inactiveuserthreshold = 1000 * 60 * 60; /** * autolockdown - whether or not to automatically kill the server when it is * in lockdown mode and the final battle finishes. This is potentially useful * to prevent forgetting to restart after a lockdown where battles are finished. * * @type {boolean} */ exports.autolockdown = true; /** * noguestsecurity - purely for development servers: allows logging in without * a signed token: simply send `/trn [USERNAME]`. This allows using PS without * a login server. * * Logging in this way will make you considered an unregistered user and grant * no authority. You cannot log into a trusted (g+/r%) user account this way. */ exports.noguestsecurity = false; /** * tourroom - specify a room to receive tournament announcements (defaults to * the room 'tournaments'). * tourannouncements - announcements are only allowed in these rooms * tourdefaultplayercap - a set cap of how many players can be in a tournament * ratedtours - toggles tournaments being ladder rated (true) or not (false) */ exports.tourroom = ''; /** @type {string[]} */ exports.tourannouncements = [/* roomids */]; exports.tourdefaultplayercap = 0; exports.ratedtours = false; /** * appealurl - specify a URL containing information on how users can appeal * disciplinary actions on your section. You can also leave this blank, in * which case users won't be given any information on how to appeal. */ exports.appealurl = ''; /** * repl - whether repl sockets are enabled or not * replsocketprefix - the prefix for the repl sockets to be listening on * replsocketmode - the file mode bits to use for the repl sockets */ exports.repl = true; exports.replsocketprefix = './logs/repl/'; exports.replsocketmode = 0o600; /** * disablehotpatchall - disables `/hotpatch all`. Generally speaking, there's a * pretty big need for /hotpatch all - convenience. The only advantage any hotpatch * forms other than all is lower RAM use (which is only a problem for Main because * Main is huge), and to do pinpoint hotpatching (like /nohotpatch). */ exports.disablehotpatchall = false; /** * forcedpublicprefixes - user ID prefixes which will be forced to battle publicly. * Battles involving user IDs which begin with one of the prefixes configured here * will be unaffected by various battle privacy commands such as /modjoin, /hideroom * or /ionext. * @type {string[] | undefined} */ exports.forcedpublicprefixes = []; /** * startuphook - function to call when the server is fully initialized and ready * to serve requests. */ exports.startuphook = function () {}; /** * lastfmkey - the API key to let users use the last.fm commands from The Studio's * chat plugin. */ exports.lastfmkey = ''; /** * chatlogreader - the search method used for searching chatlogs. * @type {'ripgrep' | 'fs'} */ exports.chatlogreader = 'fs'; /** * permissions and groups: * Each entry in `grouplist` is a seperate group. Some of the members are "special" * while the rest is just a normal permission. * The order of the groups determines their ranking. * The special members are as follows: * - symbol: Specifies the symbol of the group (as shown in front of the username) * - id: Specifies an id for the group. * - name: Specifies the human-readable name for the group. * - root: If this is true, the group can do anything. * - inherit: The group uses the group specified's permissions if it cannot * find the permission in the current group. Never make the graph * produced using this member have any cycles, or the server won't run. * - jurisdiction: The default jurisdiction for targeted permissions where one isn't * explictly specified. "Targeted permissions" are permissions * that might affect another user, such as `ban' or `promote'. * 's' is a special group where it means the user itself only * and 'u' is another special group where it means all groups * lower in rank than the current group. * - roomonly: forces the group to be a per-room moderation rank only. * - globalonly: forces the group to be a global rank only. * All the possible permissions are as follows: * - console: Developer console (>>). * - lockdown: /lockdown and /endlockdown commands. * - hotpatch: /hotpatch, /crashfixed and /savelearnsets commands. * - ignorelimits: Ignore limits such as chat message length. * - promote: Promoting and demoting. Will only work if the target user's current * group and target group are both in jurisdiction. * - room: /roompromote to (eg. roomvoice) * - makeroom: Create/delete chatrooms, and set modjoin/roomdesc/privacy * - editroom: Editing properties of rooms * - editprivacy: Set modjoin/privacy only for battles * - globalban: Banning and unbanning from the entire server. * - ban: Banning and unbanning in rooms. * - mute: Muting and unmuting. * - lock: locking (ipmute) and unlocking. * - receivemutedpms: Receive PMs from muted users. * - forcerename: /fr command. * - ip: IP checking. * - alts: Alt checking. * - modlog: view the moderator logs. * - show: Show command output to other users. * - showmedia: Show images and videos to other users. * - declare: /declare command. * - announce: /announce command. * - modchat: Set modchat. * - potd: Set PotD. * - forcewin: /forcewin command. * - battlemessage: /a command. * - tournaments: creating tournaments (/tour new, settype etc.) * - gamemoderation: /tour dq, autodq, end etc. * - gamemanagement: enable/disable games, minigames, and tournaments. * - minigame: make minigames (hangman, polls, etc.). * - game: make games. */ exports.grouplist = [ { symbol: '~', id: "admin", name: "Administrator", inherit: '@', jurisdiction: 'u', globalonly: true, console: true, bypassall: true, lockdown: true, promote: '~u', roomowner: true, roombot: true, roommod: true, roomdriver: true, forcewin: true, declare: true, addhtml: true, rangeban: true, makeroom: true, editroom: true, editprivacy: true, potd: true, disableladder: true, gdeclare: true, gamemanagement: true, exportinputlog: true, tournaments: true, }, { symbol: '#', id: "owner", name: "Room Owner", inherit: '@', jurisdiction: 'u', roomonly: true, roombot: true, roommod: true, roomdriver: true, roomprizewinner: true, editroom: true, declare: true, addhtml: true, gamemanagement: true, tournaments: true, }, { symbol: '\u2605', id: "host", name: "Host", inherit: '@', jurisdiction: 'u', roomonly: true, declare: true, modchat: 'a', gamemanagement: true, forcewin: true, tournaments: true, joinbattle: true, }, { symbol: '@', id: "mod", name: "Moderator", inherit: '%', jurisdiction: 'u', globalban: true, ban: true, modchat: 'a', roomvoice: true, roomwhitelist: true, forcerename: true, ip: true, alts: '@u', game: true, }, { symbol: '%', id: "driver", name: "Driver", inherit: '+', jurisdiction: 'u', globalGroupInPersonalRoom: '@', announce: true, warn: '\u2605u', kick: true, mute: '\u2605u', lock: true, forcerename: true, timer: true, modlog: true, alts: '%u', bypassblocks: 'u%@~', receiveauthmessages: true, gamemoderation: true, jeopardy: true, joinbattle: true, minigame: true, modchat: true, hiderank: true, }, { // Bots are ranked below Driver/Mod so that Global Bots can be kept out // of modjoin % rooms (namely, Staff). // (They were previously above Driver/Mod so they can have game management // permissions drivers don't, but these permissions can be manually given.) symbol: '*', id: "bot", name: "Bot", inherit: '%', jurisdiction: 'u', addhtml: true, tournaments: true, declare: true, bypassafktimer: true, gamemanagement: true, ip: false, globalban: false, lock: false, forcerename: false, alts: false, }, { symbol: '\u2606', id: "player", name: "Player", inherit: '+', battleonly: true, roomvoice: true, modchat: true, editprivacy: true, gamemanagement: true, joinbattle: true, nooverride: true, }, { symbol: '+', id: "voice", name: "Voice", inherit: ' ', altsself: true, makegroupchat: true, joinbattle: true, show: true, showmedia: true, exportinputlog: true, importinputlog: true, }, { symbol: '^', id: "prizewinner", name: "Prize Winner", roomonly: true, }, { symbol: 'whitelist', id: "whitelist", name: "Whitelist", inherit: ' ', roomonly: true, altsself: true, show: true, showmedia: true, exportinputlog: true, importinputlog: true, }, { symbol: ' ', ipself: true, }, { name: 'Locked', id: 'locked', symbol: '\u203d', punishgroup: 'LOCK', }, { name: 'Muted', id: 'muted', symbol: '!', punishgroup: 'MUTE', }, ];