1107 lines
35 KiB
Plaintext
1107 lines
35 KiB
Plaintext
{
|
|
/*
|
|
./\/\.' ENiGMA½ Menu Configuration -/--/-------- - -- -
|
|
|
|
_____________________ _____ ____________________ __________\_ /
|
|
\__ ____/\_ ____ \ /____/ / _____ __ \ / ______/ // /___jp!
|
|
// __|___// | \// |// | \// | | \// \ /___ /_____
|
|
/____ _____| __________ ___|__| ____| \ / _____ \
|
|
---- \______\ -- |______\ ------ /______/ ---- |______\ - |______\ /__/ // ___/
|
|
/__ _\
|
|
<*> ENiGMA½ // HTTPS://GITHUB.COM/NUSKOOLER/ENIGMA-BBS <*> /__/
|
|
|
|
*-----------------------------------------------------------------------------*
|
|
|
|
General Information
|
|
------------------------------- - -
|
|
This configuration is in HJSON (http://hjson.org/) format. Strict to-spec
|
|
JSON is also perfectly valid. Use 'hjson' from npm to convert to/from JSON.
|
|
|
|
See http://hjson.org/ for more information and syntax.
|
|
|
|
Various editors and IDEs such as Sublime Text 3, Visual Studio Code, and so
|
|
on have syntax highlighting for the HJSON format which are highly recommended.
|
|
|
|
------------------------------- -- - -
|
|
Menu Configuration
|
|
------------------------------- - -
|
|
ENiGMA½ makes no assumptions about specific menu types (main, doors, etc.),
|
|
but instead allows full customization of all menus throughout the system.
|
|
Some menus such as a main menu are considered "standard" while others are
|
|
backed by a specific module. SysOps can tweak various settings about these
|
|
modules (look & feel, keyboard interation, and so on) or even fully replace
|
|
the module with something else.
|
|
|
|
This file starts out as an example setup. Look at the examples, change
|
|
settings, menu ordering/flow, add/remove menus, implement ACS control,
|
|
etc.!
|
|
|
|
Remember you can *live edit* this file. That is, make a change and save
|
|
while you're logged into the system and it will take effect on the next
|
|
menu change or screen refresh.
|
|
|
|
Please see RTFM ...er, uh... see the documentation for more information, and
|
|
don't be shy to ask for help:
|
|
|
|
BBS : Xibalba @ xibalba.l33t.codes
|
|
FTN : BBS Discussion on fsxNet
|
|
IRC : #enigma-bbs / FreeNode
|
|
Email : bryan@l33t.codes
|
|
*/
|
|
|
|
// You may include as many additional fragments as you like here.
|
|
includes: [
|
|
%INCLUDE_FILES%
|
|
]
|
|
|
|
// This section creates common fragments to use as @reference
|
|
common: {
|
|
escToPrev: [
|
|
{
|
|
keys: [ "escape" ]
|
|
action: @systemMethod:prevMenu
|
|
}
|
|
]
|
|
|
|
quitToPrev: [
|
|
{
|
|
keys: [ "escape", "q", "shift + q" ]
|
|
action: @systemMethod:prevMenu
|
|
}
|
|
]
|
|
}
|
|
|
|
menus: {
|
|
mainMenu: {
|
|
desc: Main Menu
|
|
art: MMENU
|
|
prompt: menuCommand
|
|
config: {
|
|
font: cp437
|
|
interrupt: realtime
|
|
}
|
|
submit: [
|
|
{
|
|
value: { command: "G" }
|
|
action: @menu:fullLogoffSequence
|
|
}
|
|
{
|
|
value: { command: "D" }
|
|
action: @menu:doorsMainMenu
|
|
}
|
|
{
|
|
value: { command: "F" }
|
|
action: @menu:fileBaseMainMenu
|
|
}
|
|
{
|
|
value: { command: "U" }
|
|
action: @menu:mainMenuUserList
|
|
}
|
|
{
|
|
value: { command: "L" }
|
|
action: @menu:mainMenuLastCallers
|
|
}
|
|
{
|
|
value: { command: "W" }
|
|
action: @menu:mainMenuWhosOnline
|
|
}
|
|
{
|
|
value: { command: "Y" }
|
|
action: @menu:mainMenuUserStats
|
|
}
|
|
{
|
|
value: { command: "M" }
|
|
action: @menu:messageBaseMainMenu
|
|
}
|
|
{
|
|
value: { command: "E" }
|
|
action: @menu:privateMailMenu
|
|
}
|
|
{
|
|
value: { command: "C" }
|
|
action: @menu:mainMenuUserConfig
|
|
}
|
|
{
|
|
value: { command: "S" }
|
|
action: @menu:mainMenuSystemStats
|
|
}
|
|
{
|
|
value: { command: "!" }
|
|
action: @menu:mainMenuGlobalNewScan
|
|
}
|
|
{
|
|
value: { command: "K" }
|
|
action: @menu:mainMenuFeedbackToSysOp
|
|
}
|
|
{
|
|
value: { command: "O" }
|
|
action: @menu:mainMenuOnelinerz
|
|
}
|
|
{
|
|
value: { command: "R" }
|
|
action: @menu:mainMenuRumorz
|
|
}
|
|
{
|
|
value: { command: "BBS"}
|
|
action: @menu:bbsList
|
|
}
|
|
{
|
|
value: { command: "UA" }
|
|
action: @menu:mainMenuUserAchievementsEarned
|
|
}
|
|
{
|
|
value: { command: "MRC" }
|
|
action: @menu:mrc
|
|
}
|
|
{
|
|
value: { command: "!WFC" }
|
|
action: @menu:mainMenuWaitingForCaller
|
|
}
|
|
{
|
|
value: { command: "2FA" }
|
|
action: [
|
|
{
|
|
//
|
|
// For security reasons, only allow 2FA/OTP to be
|
|
// configured over already secure (SSL, wss://, ...)
|
|
// connections. Not doing so risks leaking secrets!
|
|
//
|
|
acs: SC
|
|
action: @menu:userTwoFactorAuthOTPConfig
|
|
}
|
|
{
|
|
action: @menu:userTwoFactorAuthOTPSecConnRequired
|
|
}
|
|
]
|
|
}
|
|
{
|
|
value: { command: "MSG" }
|
|
action: @menu:nodeMessage
|
|
}
|
|
]
|
|
}
|
|
|
|
mainMenuUserAchievementsEarned: {
|
|
desc: Achievements
|
|
module: user_achievements_earned
|
|
art: USERACHIEV
|
|
form: {
|
|
0: {
|
|
mci: {
|
|
VM1: {
|
|
focus: true
|
|
}
|
|
}
|
|
actionKeys: @reference:common.quitToPrev
|
|
}
|
|
}
|
|
}
|
|
|
|
mainMenuWaitingForCaller: {
|
|
desc: -WFC-
|
|
module: wfc
|
|
|
|
config: {
|
|
art: {
|
|
main: wfc
|
|
help: wfchelp
|
|
}
|
|
}
|
|
|
|
form: {
|
|
0: {
|
|
mci: {
|
|
VM1: {
|
|
focus: true
|
|
}
|
|
VM2: {
|
|
focus: false
|
|
acceptsFocus: false
|
|
acceptsInput: false
|
|
}
|
|
}
|
|
|
|
actionKeys: [
|
|
{
|
|
keys: [ "a", "shift + a" ]
|
|
action: @method:toggleAvailable
|
|
}
|
|
{
|
|
keys: [ "v", "shift + v" ]
|
|
action: @method:toggleVisible
|
|
}
|
|
{
|
|
keys: [ "?", "h", "shift + h" ]
|
|
action: @method:displayHelp
|
|
}
|
|
{
|
|
keys: [ "1", "2", "3", "4", "5", "6", "7", "8", "9" ]
|
|
action: @method:setNodeStatusSelection
|
|
}
|
|
{
|
|
keys: [ "k", "shift + k" ]
|
|
action: @method:kickSelectedNode
|
|
}
|
|
{
|
|
keys: [ "escape", "q", "shift + q" ]
|
|
action: @systemMethod:prevMenu
|
|
}
|
|
]
|
|
}
|
|
|
|
// confirmKickNodePrompt
|
|
3: {
|
|
submit: {
|
|
*: [
|
|
{
|
|
value: { promptValue: 0 }
|
|
action: @method:kickNodeYes
|
|
}
|
|
{
|
|
value: { promptValue: 1 }
|
|
action: @method:kickNodeNo
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
mrc: {
|
|
desc: MRC Chat
|
|
module: mrc
|
|
art: MRC
|
|
config: {
|
|
cls: true
|
|
|
|
// max lines kept in scrollback buffer
|
|
maxScrollbackLines: 500
|
|
}
|
|
form: {
|
|
0: {
|
|
mci: {
|
|
MT1: {
|
|
mode: preview
|
|
autoScroll: true
|
|
}
|
|
ET2: {
|
|
argName: inputArea
|
|
submit: true
|
|
focus: true
|
|
}
|
|
}
|
|
actionKeys: [
|
|
{
|
|
keys: [ "escape" ]
|
|
action: @systemMethod:prevMenu
|
|
}
|
|
{
|
|
keys: [ "down arrow", "up arrow", "page up", "page down" ]
|
|
action: @method:movementKeyPressed
|
|
}
|
|
]
|
|
submit: {
|
|
*: [
|
|
{
|
|
value: { inputArea: null }
|
|
action: @method:sendChatMessage
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
userTwoFactorAuthOTPConfig: {
|
|
desc: 2FA/OTP Config
|
|
module: user_2fa_otp_config
|
|
art: 2FACONFSCR
|
|
form: {
|
|
0: {
|
|
mci: {
|
|
TM1: {
|
|
argName: enableToggle
|
|
focus: true
|
|
items: [
|
|
// order is important here:
|
|
"disable"
|
|
"enable/reset"
|
|
]
|
|
}
|
|
SM2: {
|
|
argName: otpType
|
|
items: [
|
|
// order is important here:
|
|
"Time-Based - TOTP"
|
|
"HMAC-Based - HOTP"
|
|
"Google Authenticator"
|
|
]
|
|
}
|
|
TM3: {
|
|
argName: submit
|
|
items: [
|
|
"save"
|
|
"cancel"
|
|
]
|
|
submit: true
|
|
}
|
|
}
|
|
|
|
submit: {
|
|
*: [
|
|
{
|
|
value: { submit: 0 }
|
|
action: @method:saveChanges
|
|
}
|
|
{
|
|
value: { submit: 1 }
|
|
action: @systemMethod:prevMenu
|
|
}
|
|
]
|
|
}
|
|
|
|
actionKeys: [
|
|
{
|
|
keys: [ "escape" ]
|
|
action: @systemMethod:prevMenu
|
|
}
|
|
{
|
|
keys: [ "q", "shift + q" ]
|
|
action: @method:showQRCode
|
|
}
|
|
{
|
|
keys: [ "s", "shift + s" ]
|
|
action: @method:showSecret
|
|
}
|
|
{
|
|
keys: [ "b", "shift + b" ]
|
|
action: @method:showBackupCodes
|
|
}
|
|
{
|
|
keys: [ "n", "shift + n" ]
|
|
action: @method:generateNewBackupCodes
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
|
|
userTwoFactorAuthOTPSecConnRequired: {
|
|
desc: Insecure Warning
|
|
art: 2FAOTPSECREQ
|
|
config: {
|
|
cls: true
|
|
pause: true
|
|
}
|
|
}
|
|
|
|
userTwoFactorAuthOTPConfigShowDetails: {
|
|
desc: 2FA/OTP Details
|
|
module: show_art
|
|
config: {
|
|
pause: true
|
|
method: extraArgs
|
|
}
|
|
}
|
|
|
|
nodeMessage: {
|
|
desc: Node Messaging
|
|
module: node_msg
|
|
art: NODEMSG
|
|
config: {
|
|
cls: true
|
|
art: {
|
|
header: NODEMSGHDR
|
|
footer: NODEMSGFTR
|
|
}
|
|
}
|
|
form: {
|
|
0: {
|
|
mci: {
|
|
SM1: {
|
|
argName: node
|
|
}
|
|
ET2: {
|
|
argName: message
|
|
submit: true
|
|
}
|
|
}
|
|
actionKeys: [
|
|
{
|
|
keys: [ "escape" ]
|
|
action: @systemMethod:prevMenu
|
|
}
|
|
]
|
|
submit: {
|
|
*: [
|
|
{
|
|
value: { message: null }
|
|
action: @method:sendMessage
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
mainMenuLastCallers: {
|
|
desc: Last Callers
|
|
module: last_callers
|
|
art: LASTCALL
|
|
config: { pause: true }
|
|
}
|
|
|
|
mainMenuWhosOnline: {
|
|
desc: Who's Online
|
|
module: whos_online
|
|
art: WHOSON
|
|
config: { pause: true }
|
|
}
|
|
|
|
mainMenuUserStats: {
|
|
desc: User Stats
|
|
art: STATUS
|
|
config: { pause: true }
|
|
}
|
|
|
|
mainMenuSystemStats: {
|
|
desc: System Stats
|
|
art: SYSSTAT
|
|
config: { pause: true }
|
|
}
|
|
|
|
mainMenuUserList: {
|
|
desc: User Listing
|
|
module: user_list
|
|
art: USERLST
|
|
form: {
|
|
0: {
|
|
mci: {
|
|
VM1: {
|
|
focus: true
|
|
submit: true
|
|
}
|
|
}
|
|
actionKeys: @reference:common.quitToPrev
|
|
}
|
|
}
|
|
}
|
|
|
|
mainMenuUserConfig: {
|
|
desc: User Config
|
|
module: user_config
|
|
art: CONFSCR
|
|
form: {
|
|
0: {
|
|
mci: {
|
|
ET1: {
|
|
argName: realName
|
|
maxLength: @config:users.realNameMax
|
|
validate: @systemMethod:validateNonEmpty
|
|
focus: true
|
|
}
|
|
ME2: {
|
|
argName: birthdate
|
|
maskPattern: "####/##/##"
|
|
}
|
|
ME3: {
|
|
argName: sex
|
|
maskPattern: A
|
|
textStyle: upper
|
|
validate: @systemMethod:validateNonEmpty
|
|
}
|
|
ET4: {
|
|
argName: location
|
|
maxLength: @config:users.locationMax
|
|
validate: @systemMethod:validateNonEmpty
|
|
}
|
|
ET5: {
|
|
argName: affils
|
|
maxLength: @config:users.affilsMax
|
|
}
|
|
ET6: {
|
|
argName: email
|
|
maxLength: @config:users.emailMax
|
|
validate: @method:validateEmailAvail
|
|
}
|
|
ET7: {
|
|
argName: web
|
|
maxLength: @config:users.webMax
|
|
}
|
|
ME8: {
|
|
maskPattern: "##"
|
|
argName: termHeight
|
|
validate: @systemMethod:validateNonEmpty
|
|
}
|
|
SM9: {
|
|
argName: theme
|
|
}
|
|
ET10: {
|
|
argName: password
|
|
maxLength: @config:users.passwordMax
|
|
password: true
|
|
validate: @method:validatePassword
|
|
}
|
|
ET11: {
|
|
argName: passwordConfirm
|
|
maxLength: @config:users.passwordMax
|
|
password: true
|
|
validate: @method:validatePassConfirmMatch
|
|
}
|
|
TM25: {
|
|
argName: submission
|
|
items: [ "save", "cancel" ]
|
|
submit: true
|
|
}
|
|
}
|
|
|
|
submit: {
|
|
*: [
|
|
{
|
|
value: { submission: 0 }
|
|
action: @method:saveChanges
|
|
}
|
|
{
|
|
value: { submission: 1 }
|
|
action: @systemMethod:prevMenu
|
|
}
|
|
]
|
|
}
|
|
|
|
actionKeys: [
|
|
{
|
|
keys: [ "escape" ]
|
|
action: @systemMethod:prevMenu
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
|
|
mainMenuGlobalNewScan: {
|
|
desc: New Scan
|
|
module: new_scan
|
|
art: NEWSCAN
|
|
config: {
|
|
messageListMenu: newScanMessageList
|
|
}
|
|
}
|
|
|
|
mainMenuFeedbackToSysOp: {
|
|
desc: SysOp Feedback
|
|
module: msg_area_post_fse
|
|
config: {
|
|
art: {
|
|
header: MSGEHDR
|
|
body: MSGBODY
|
|
footerEditor: MSGEFTR
|
|
footerEditorMenu: MSGEMFT
|
|
help: MSGEHLP
|
|
},
|
|
editorMode: edit
|
|
editorType: email
|
|
messageAreaTag: private_mail
|
|
toUserId: 1 /* always to +op */
|
|
}
|
|
form: {
|
|
0: {
|
|
mci: {
|
|
TL1: {
|
|
argName: from
|
|
}
|
|
ET2: {
|
|
argName: to
|
|
focus: true
|
|
text: @sysStat:sysop_username
|
|
maxLength: 36
|
|
// :TODO: readOnly: true
|
|
}
|
|
ET3: {
|
|
argName: subject
|
|
maxLength: 72
|
|
submit: true
|
|
validate: @systemMethod:validateMessageSubject
|
|
}
|
|
}
|
|
submit: {
|
|
3: [
|
|
{
|
|
value: { subject: null }
|
|
action: @method:headerSubmit
|
|
}
|
|
]
|
|
}
|
|
actionKeys: [
|
|
{
|
|
keys: [ "escape" ]
|
|
action: @systemMethod:prevMenu
|
|
}
|
|
]
|
|
}
|
|
1: {
|
|
mci: {
|
|
MT1: {
|
|
width: 79
|
|
argName: message
|
|
mode: edit
|
|
}
|
|
}
|
|
|
|
submit: {
|
|
*: [ { value: "message", action: "@method:editModeEscPressed" } ]
|
|
}
|
|
actionKeys: [
|
|
{
|
|
keys: [ "escape" ]
|
|
viewId: 1
|
|
}
|
|
]
|
|
},
|
|
2: {
|
|
TLTL: {
|
|
mci: {
|
|
TL1: {
|
|
width: 5
|
|
}
|
|
TL2: {
|
|
width: 4
|
|
}
|
|
}
|
|
}
|
|
}
|
|
3: {
|
|
HM: {
|
|
mci: {
|
|
HM1: {
|
|
// :TODO: clear
|
|
items: [ "save", "discard", "help" ]
|
|
}
|
|
}
|
|
submit: {
|
|
*: [
|
|
{
|
|
value: { 1: 0 }
|
|
action: @method:editModeMenuSave
|
|
}
|
|
{
|
|
value: { 1: 1 }
|
|
action: @systemMethod:prevMenu
|
|
}
|
|
{
|
|
value: { 1: 2 }
|
|
action: @method:editModeMenuHelp
|
|
}
|
|
]
|
|
}
|
|
actionKeys: [
|
|
{
|
|
keys: [ "escape" ]
|
|
action: @method:editModeEscPressed
|
|
}
|
|
{
|
|
keys: [ "?" ]
|
|
action: @method:editModeMenuHelp
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
mainMenuOnelinerz: {
|
|
desc: Viewing Onelinerz
|
|
module: onelinerz
|
|
config: {
|
|
cls: true
|
|
art: {
|
|
view: ONELINER
|
|
add: ONEADD
|
|
}
|
|
}
|
|
form: {
|
|
0: {
|
|
mci: {
|
|
VM1: {
|
|
focus: false
|
|
height: 10
|
|
}
|
|
TM2: {
|
|
argName: addOrExit
|
|
items: [ "yeah!", "nah" ]
|
|
"hotKeys" : { "Y" : 0, "N" : 1, "Q" : 1 }
|
|
submit: true
|
|
focus: true
|
|
}
|
|
}
|
|
submit: {
|
|
*: [
|
|
{
|
|
value: { addOrExit: 0 }
|
|
action: @method:viewAddScreen
|
|
}
|
|
{
|
|
value: { addOrExit: null }
|
|
action: @systemMethod:nextMenu
|
|
}
|
|
]
|
|
}
|
|
actionKeys: [
|
|
{
|
|
keys: [ "escape" ]
|
|
action: @systemMethod:nextMenu
|
|
}
|
|
]
|
|
},
|
|
1: {
|
|
mci: {
|
|
ET1: {
|
|
focus: true
|
|
maxLength: 70
|
|
argName: oneliner
|
|
}
|
|
TL2: {
|
|
width: 60
|
|
}
|
|
TM3: {
|
|
argName: addOrCancel
|
|
items: [ "add", "cancel" ]
|
|
"hotKeys" : { "A" : 0, "C" : 1, "Q" : 1 }
|
|
submit: true
|
|
}
|
|
}
|
|
|
|
submit: {
|
|
*: [
|
|
{
|
|
value: { addOrCancel: 0 }
|
|
action: @method:addEntry
|
|
}
|
|
{
|
|
value: { addOrCancel: 1 }
|
|
action: @method:cancelAdd
|
|
}
|
|
]
|
|
}
|
|
actionKeys: [
|
|
{
|
|
keys: [ "escape" ]
|
|
action: @method:cancelAdd
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
|
|
mainMenuRumorz: {
|
|
desc: Rumorz
|
|
module: rumorz
|
|
config: {
|
|
cls: true
|
|
art: {
|
|
entries: RUMORS
|
|
add: RUMORADD
|
|
}
|
|
}
|
|
form: {
|
|
0: {
|
|
mci: {
|
|
VM1: {
|
|
focus: false
|
|
height: 10
|
|
}
|
|
TM2: {
|
|
argName: addOrExit
|
|
items: [ "yeah!", "nah" ]
|
|
"hotKeys" : { "Y" : 0, "N" : 1, "Q" : 1 }
|
|
submit: true
|
|
focus: true
|
|
}
|
|
}
|
|
submit: {
|
|
*: [
|
|
{
|
|
value: { addOrExit: 0 }
|
|
action: @method:viewAddScreen
|
|
}
|
|
{
|
|
value: { addOrExit: null }
|
|
action: @systemMethod:nextMenu
|
|
}
|
|
]
|
|
}
|
|
actionKeys: [
|
|
{
|
|
keys: [ "escape" ]
|
|
action: @systemMethod:nextMenu
|
|
}
|
|
]
|
|
},
|
|
1: {
|
|
mci: {
|
|
ET1: {
|
|
focus: true
|
|
maxLength: 70
|
|
argName: rumor
|
|
}
|
|
TL2: {
|
|
width: 60
|
|
}
|
|
TM3: {
|
|
argName: addOrCancel
|
|
items: [ "add", "cancel" ]
|
|
"hotKeys" : { "A" : 0, "C" : 1, "Q" : 1 }
|
|
submit: true
|
|
}
|
|
}
|
|
|
|
submit: {
|
|
*: [
|
|
{
|
|
value: { addOrCancel: 0 }
|
|
action: @method:addEntry
|
|
}
|
|
{
|
|
value: { addOrCancel: 1 }
|
|
action: @method:cancelAdd
|
|
}
|
|
]
|
|
}
|
|
actionKeys: [
|
|
{
|
|
keys: [ "escape" ]
|
|
action: @method:cancelAdd
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
|
|
bbsList: {
|
|
desc: BBS List
|
|
module: bbs_list
|
|
config: {
|
|
cls: true
|
|
art: {
|
|
entries: BBSLIST
|
|
add: BBSADD
|
|
}
|
|
}
|
|
|
|
form: {
|
|
0: {
|
|
mci: {
|
|
VM1: { maxLength: 32 }
|
|
TL2: { maxLength: 32 }
|
|
TL3: { maxLength: 32 }
|
|
TL4: { maxLength: 32 }
|
|
TL5: { maxLength: 32 }
|
|
TL6: { maxLength: 32 }
|
|
TL7: { maxLength: 32 }
|
|
TL8: { maxLength: 32 }
|
|
TL9: { maxLength: 32 }
|
|
}
|
|
actionKeys: [
|
|
{
|
|
keys: [ "a" ]
|
|
action: @method:addBBS
|
|
}
|
|
{
|
|
// :TODO: add delete key
|
|
keys: [ "d" ]
|
|
action: @method:deleteBBS
|
|
}
|
|
{
|
|
keys: [ "q", "escape" ]
|
|
action: @systemMethod:prevMenu
|
|
}
|
|
]
|
|
}
|
|
1: {
|
|
mci: {
|
|
ET1: {
|
|
argName: name
|
|
maxLength: 32
|
|
validate: @systemMethod:validateNonEmpty
|
|
}
|
|
ET2: {
|
|
argName: sysop
|
|
maxLength: 32
|
|
validate: @systemMethod:validateNonEmpty
|
|
}
|
|
ET3: {
|
|
argName: telnet
|
|
maxLength: 32
|
|
validate: @systemMethod:validateNonEmpty
|
|
}
|
|
ET4: {
|
|
argName: www
|
|
maxLength: 32
|
|
}
|
|
ET5: {
|
|
argName: location
|
|
maxLength: 32
|
|
}
|
|
ET6: {
|
|
argName: software
|
|
maxLength: 32
|
|
}
|
|
ET7: {
|
|
argName: notes
|
|
maxLength: 32
|
|
}
|
|
TM17: {
|
|
argName: submission
|
|
items: [ "save", "cancel" ]
|
|
submit: true
|
|
}
|
|
}
|
|
|
|
actionKeys: [
|
|
{
|
|
keys: [ "escape" ]
|
|
action: @method:cancelSubmit
|
|
}
|
|
]
|
|
|
|
submit: {
|
|
*: [
|
|
{
|
|
value: { "submission" : 0 }
|
|
action: @method:submitBBS
|
|
}
|
|
{
|
|
value: { "submission" : 1 }
|
|
action: @method:cancelSubmit
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
fullLogoffSequence: {
|
|
desc: Logging Off
|
|
prompt: logoffConfirmation
|
|
submit: [
|
|
{
|
|
value: { promptValue: 0 }
|
|
action: @menu:fullLogoffSequencePreAd
|
|
}
|
|
{
|
|
value: { promptValue: 1 }
|
|
action: @systemMethod:prevMenu
|
|
}
|
|
]
|
|
}
|
|
|
|
fullLogoffSequencePreAd: {
|
|
desc: Logging Off
|
|
art: PRELOGAD
|
|
next: fullLogoffSequenceRandomBoardAd
|
|
config: {
|
|
cls: true
|
|
nextTimeout: 1500
|
|
}
|
|
}
|
|
|
|
fullLogoffSequenceRandomBoardAd: {
|
|
desc: Logging Off
|
|
art: OTHRBBS
|
|
next: logoff
|
|
config: {
|
|
baudRate: 57600
|
|
pause: true
|
|
cls: true
|
|
}
|
|
}
|
|
|
|
logoff: {
|
|
desc: Logging Off
|
|
art: LOGOFF
|
|
next: @systemMethod:logoff
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
// These entries are required by the system and must exist.
|
|
// You can still modify/theme them, however.
|
|
////////////////////////////////////////////////////////////////////////
|
|
idleLogoff: {
|
|
art: IDLELOG
|
|
next: @systemMethod:logoff
|
|
}
|
|
}
|
|
|
|
prompts: {
|
|
menuCommand: {
|
|
art: MNUPRMT
|
|
mci: {
|
|
TL1: { }
|
|
ET2: {
|
|
argName: command
|
|
width: 20
|
|
maxLength: 20
|
|
submit: true
|
|
textStyle: upper
|
|
focus: true
|
|
}
|
|
}
|
|
}
|
|
|
|
logoffConfirmation: {
|
|
art: LOGPMPT
|
|
mci: {
|
|
TM1: {
|
|
argName: promptValue
|
|
items: [ "yes", "no" ]
|
|
focus: true
|
|
hotKeys: { Y: 0, N: 1 }
|
|
hotKeySubmit: true
|
|
}
|
|
}
|
|
}
|
|
|
|
forgotPasswordPrompt: {
|
|
art: FORGOTPW
|
|
mci: {
|
|
ET1: {
|
|
argName: username
|
|
maxLength: @config:users.usernameMax
|
|
width: 32
|
|
focus: true
|
|
}
|
|
}
|
|
actionKeys: [
|
|
{
|
|
keys: [ "escape" ]
|
|
action: @systemMethod:prevMenu
|
|
}
|
|
]
|
|
}
|
|
|
|
// WFC
|
|
confirmKickNodePrompt: {
|
|
art: wfckicknodeprompt
|
|
mci: {
|
|
TM1: {
|
|
argName: promptValue
|
|
items: [ "yes", "no" ]
|
|
focus: true
|
|
hotKeys: { Y: 0, N: 1 }
|
|
hotKeySubmit: true
|
|
}
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
// These entries are required by the system and must exist.
|
|
// You can still modify/theme them, however.
|
|
////////////////////////////////////////////////////////////////////////
|
|
pause: {
|
|
art: pause
|
|
config: {
|
|
trailingLF: no
|
|
}
|
|
}
|
|
}
|
|
}
|