diff --git a/NOTES.md b/NOTES.md index dcea2dbc93ca931b2db98cd2c08763bdf8b1dff0..8df25d955aad5b4c9c3cba26ac45c619fea2301e 100644 --- a/NOTES.md +++ b/NOTES.md @@ -32,7 +32,7 @@ repl.commands? * Messages: ~~ADD~~, CURRENT, ~~DIRECTORY~~, BACK, CHANGE, FIRST, REMOVE, NEXT, ~~READ~~ * Messages edit: CHANGE, REPLY, FORWARD * Moving messages: COPY, MOVE - * Compound commands: SET and SHOW + * Compound commands: SET and SHOW - make HELP work for them. * Mail: MAIL, FORWARD, * Implement batch jobs * ~~Editor - need an embedded editor~~ Implemented using tview; good enough @@ -60,7 +60,7 @@ repl.commands? * Commands for a local mail system? * Commands to connect to Mattermost or mastodon? * Commands to manage users. - * `SHOW VERSION` - [versioninfo](https://github.com/earthboundkid/versioninfo) will work for go install. + * ~~SHOW VERSION~~ * Check db version; notify user if it changes; refuse to write to db if it has. ## Module links diff --git a/repl/command.go b/repl/command.go index 9472a1cb11994eb76df9ea20ed280da2890ab998..88e4f1bff3f887f870d680871c3880f056043fc7 100644 --- a/repl/command.go +++ b/repl/command.go @@ -891,8 +891,8 @@ will be displayed. However, if there are new messages, the first new message will be displayed. Each time you enter the command, the next page, or if there are no more pages, the next message will be displayed. - Format: - READ [message-number] + Format: + READ [message-number] The message's relative number is found by the DIRECTORY command. If you specify a number greater than the number of messages in the folder, the @@ -976,8 +976,8 @@ the help on the SEEN command.`, Description: `Removes a folder. Only the owner of a folder or a privileged user can remove the folder. - Format: - REMOVE folder-name`, + Format: + REMOVE folder-name`, MinArgs: 1, MaxArgs: 1, Action: ActionRemove, @@ -987,8 +987,8 @@ remove the folder. read message with "RE:" preceeding it. Format and qualifiers is exactly the same as the ADD command except for /NOINDENT and /EXTRACT. - Format: - REPLY [file-name]`, + Format: + REPLY [file-name]`, MaxArgs: 1, Action: ActionReply, Flags: dclish.Flags{ @@ -1014,8 +1014,8 @@ the same as the ADD command except for /NOINDENT and /EXTRACT. Description: `Invokes the VAX/VMS Personal Mail Utility (MAIL) to send a reply mail message to the owner of the currently read message. - Format: - RESPOND [file-name] + Format: + RESPOND [file-name] If you wish to use another method for sending the mail, define BULL_MAILER to point to a command procedure. This procedure will then be @@ -1078,8 +1078,8 @@ username and subject of the message.`, Description: `Searches the currently selected folder for the message containing the first occurrence of the specified text string. - Format: - SEARCH [search-string] + Format: + SEARCH [search-string] The search starts from the first message in the current folder. The search includes both the text of the message, and the description @@ -1183,8 +1183,8 @@ message.`, Description: `The SET command is used with other commands to define or change characteristics of the BULLETIN Utility. - Format: - SET option`, + Format: + SET option`, Commands: dclish.Commands{ "ACCESS": { Description: `Controls access to a private folder. A private folder can only be @@ -1348,8 +1348,8 @@ If no expiration date is entered when prompted for a date, or if prompting has been disabled via SET NOPROMPT_EXPIRE, this value will be used. - Format: - SET DEFAULT_EXPIRE days + Format: + SET DEFAULT_EXPIRE days If -1 is specified, messages will become permanent. If 0 is specified, no default expiration date will be present. The latter should never be @@ -1478,8 +1478,8 @@ the folder was created by the owner. In order to apply this to a specific folder, first select the folder (using the SELECT command), and then enter the SET READNEW command. - Format: - SET [NO]READNEW + Format: + SET READNEW NOTE: If you have several folders with READNEW enabled, each folder's messages will be displayed separately. However, if you EXIT the READNEW @@ -1503,12 +1503,6 @@ SYSTEM for a description of a SYSTEM folder).`, folder. This is a privileged qualifier. It will only affect brand new users (or those that have never logged in). Use /ALL to modify all users.`, - }, - "/FOLDER": { - Description: `/FOLDER=foldername - - Specifies the folder for which the option is to modified. If not - specified, the selected folder is modified. Valid only with NOREADNEW.`, }, "/PERMANENT": { Description: `/[NO]PERMANENT @@ -1518,6 +1512,42 @@ SYSTEM for a description of a SYSTEM folder).`, }, }, }, + "NOREADNEW": { + Description: `Turns off READNEW. + Format: + SET NOREADNEW + +NOTE: If you have several folders with READNEW enabled, each folder's +messages will be displayed separately. However, if you EXIT the READNEW +mode before all the folders have been displayed, you will not be alerted +of the new messages in the undisplayed folders the next time you login. +However, if you enter BULLETIN, you will be told that new messages are +present in those other folders. Also, it is not possible to EXIT the +READNEW mode if there are SYSTEM folders which have new messages. Typing +the EXIT command will cause you to skip to those folders. (See HELP SET +SYSTEM for a description of a SYSTEM folder).`, + Flags: dclish.Flags{ + "/ALL": { + Description: ` Specifies that the SET [NO]READNEW option is the default for all users + for the specified folder. This is a privileged qualifier. The + difference between this and /DEFAULT is that the latter will only + apply to new users (i.e. any users which have never executed + BULLETIN).`, + }, + "/DEFAULT": { + Description: ` Specifies that the [NO]READNEW option is the default for the specified + folder. This is a privileged qualifier. It will only affect brand new + users (or those that have never logged in). Use /ALL to modify all + users.`, + }, + "/FOLDER": { + Description: `/FOLDER=foldername + + Specifies the folder for which the option is to modified. If not + specified, the selected folder is modified.`, + }, + }, + }, "SHOWNEW": { Description: `Controls whether a directory listing of new messages for the current folder will be displayed when logging in. This is similar to READNEW, @@ -1529,18 +1559,44 @@ accessing BULLETIN. In order to apply this to a specific folder, first select the folder (using the SELECT command), and then enter the SET SHOWNEW command. - Format: - SET [NO]SHOWNEW`, + Format: + SET SHOWNEW`, Flags: dclish.Flags{ "/ALL": { - Description: ` Specifies that the SET [NO]SHOWNEW option is the default for all users + Description: ` Specifies that the SET SHOWNEW option is the default for all users for + the specified folder. This is a privileged qualifier. The difference + between this and /DEFAULT is that the latter will only apply to new + users (i.e. any users which have never executed BULLETIN).`, + }, + "/DEFAULT": { + Description: ` Specifies that the SHOWNEW option is the default for the specified + folder. This is a privileged qualifier. It will only affect brand new + users (or those that have never logged in). Use /ALL to modify all + users.`}, + "/PERMANENT": { + Description: `/[NO]PERMANENT + + Specifies that SHOWNEW is a permanent flag and cannot be changed by + the individual, except if changing to READNEW. This is a privileged + qualifier.`, + }, + }, + }, + "NOSHOWNEW": { + Description: `Turns off SHOWNEW + + Format: + SET NOSHOWNEW`, + Flags: dclish.Flags{ + "/ALL": { + Description: ` Specifies that the SET NOSHOWNEW option is the default for all users for the specified folder. This is a privileged qualifier. The difference between this and /DEFAULT is that the latter will only apply to new users (i.e. any users which have never executed BULLETIN).`, }, "/DEFAULT": { - Description: ` Specifies that the [NO]SHOWNEW option is the default for the specified + Description: ` Specifies that the NOSHOWNEW option is the default for the specified folder. This is a privileged qualifier. It will only affect brand new users (or those that have never logged in). Use /ALL to modify all users.`, @@ -1549,14 +1605,7 @@ In order to apply this to a specific folder, first select the folder Description: `/FOLDER=foldername Specifies the folder for which the option is to modified. If not - specified, the selected folder is modified. Valid only with NOSHOWNEW.`, - }, - "/PERMANENT": { - Description: `/[NO]PERMANENT - - Specifies that SHOWNEW is a permanent flag and cannot be changed by - the individual, except if changing to READNEW. This is a privileged - qualifier.`, + specified, the selected folder is modified.`, }, }, }, @@ -1565,7 +1614,7 @@ In order to apply this to a specific folder, first select the folder is allowed to have SYSTEM and SHUTDOWN messages added to it. This is a privileged command. - Format: + Format: SET [NO]SYSTEM By default, the GENERAL folder is a SYSTEM folder, and the setting for @@ -1593,6 +1642,7 @@ the SELECT command, information about that folder is shown. Format: SHOW FOLDER [folder-name]`, + MaxArgs: 1, Flags: dclish.Flags{ "/FULL": { Description: ` Control whether all information of the folder is displayed. This @@ -1604,9 +1654,7 @@ the SELECT command, information about that folder is shown. }, "NEW": { Description: `Shows folders which have new unread messages for which BRIEF or READNEW -have been set. (Note: If you enter BULLETIN but do not read new unread -messages, you will not be notified about them the next time you enter -BULLETIN. This is a design "feature" and cannot easily be changed.)`, +have been set.`, }, "PRIVILEGES": { Description: `Shows the privileges necessary to use privileged commands. Also shows diff --git a/repl/set.go b/repl/set.go index 4b296bc016601005c9229d7aca4d8d7edb34e34f..f87749f4e2692570767625fefdea2f9886da9d32 100644 --- a/repl/set.go +++ b/repl/set.go @@ -10,6 +10,48 @@ import ( "git.lyda.ie/kevin/bulletin/dclish" ) +// ActionSetAccess handles the `SET ACCESS` command. +func ActionSetAccess(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionSetAccess.") + return nil +} + +// ActionSetAlways handles the `SET ALWAYS` command. +func ActionSetAlways(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionSetAlways.") + return nil +} + +// ActionSetNoalways handles the `SET NOALWAYS` command. +func ActionSetNoalways(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionSetNoalways.") + return nil +} + +// ActionSetBrief handles the `SET BRIEF` command. +func ActionSetBrief(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionSetBrief.") + return nil +} + +// ActionSetNobrief handles the `SET NOBRIEF` command. +func ActionSetNobrief(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionSetNobrief.") + return nil +} + +// ActionSetDefaultExpire handles the `SET DEFAULT_EXPIRE` command. +func ActionSetDefaultExpire(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionSetDefaultExpire.") + return nil +} + +// ActionSetExpireLimit handles the `SET EXPIRE_LIMIT` command. +func ActionSetExpireLimit(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionSetExpireLimit.") + return nil +} + // ActionSetFolder handles the `SET FOLDER` command. This selects a folder. func ActionSetFolder(cmd *dclish.Command) error { if len(cmd.Args) != 1 { @@ -33,3 +75,63 @@ func ActionSetFolder(cmd *dclish.Command) error { // WRITE(6,'('' See '',A,'' if you wish to access folder.'')') return errors.New("Unable to select the folder") } + +// ActionSetNotify handles the `SET NOTIFY` command. +func ActionSetNotify(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionSetNotify.") + return nil +} + +// ActionSetNonotify handles the `SET NONOTIFY` command. +func ActionSetNonotify(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionSetNonotify.") + return nil +} + +// ActionSetPrivileges handles the `SET PRIVILEGES` command. +func ActionSetPrivileges(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionSetPrivileges.") + return nil +} + +// ActionSetPromptExpire handles the `SET PROMPT_EXPIRE` command. +func ActionSetPromptExpire(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionSetPromptExpire.") + return nil +} + +// ActionSetNoPromptExpire handles the `SET NOPROMPT_EXPIRE` command. +func ActionSetNoPromptExpire(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionSetNopromptExpire.") + return nil +} + +// ActionSetReadNew handles the `SET READNEW` command. +func ActionSetReadNew(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionSetReadNew.") + return nil +} + +// ActionSetNoReadNew handles the `SET READNEW` command. +func ActionSetNoReadNew(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionSetNoReadNew.") + return nil +} + +// ActionSetShowNew handles the `SET SHOWNEW` command. +func ActionSetShowNew(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionSetShowNew.") + return nil +} + +// ActionSetNoShowNew handles the `SET SHOWNEW` command. +func ActionSetNoShowNew(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionSetNoShowNew.") + return nil +} + +// ActionSetSystem handles the `SET SYSTEM` command. +func ActionSetSystem(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionSetSystem.") + return nil +} diff --git a/repl/show.go b/repl/show.go index 1ffa7259d4cde9745a7e102c2aa8b00a0b920eee..b3c4df28b28a612b3dbe963c484573ad45b1342b 100644 --- a/repl/show.go +++ b/repl/show.go @@ -9,9 +9,43 @@ import ( "git.lyda.ie/kevin/bulletin/dclish" ) -// ActionShowVersion handles the `SHOW VERSION` command. This selects a folder. +// ActionShowFlags handles the `SHOW FLAGS` command. +func ActionShowFlags(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionShowFlags.") + return nil +} + +// ActionShowFolder handles the `SHOW FOLDER` command. +func ActionShowFolder(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionShowFolder.") + return nil +} + +// ActionShowNew handles the `SHOW NEW` command. +func ActionShowNew(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionShowNew.") + return nil +} + +// ActionShowPrivileges handles the `SHOW PRIVILEGES` command. +func ActionShowPrivileges(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionShowPrivileges.") + return nil +} + +// ActionShowUser handles the `SHOW USER` command. +func ActionShowUser(_ *dclish.Command) error { + fmt.Println("TODO: implement ActionShowUser.") + return nil +} + +// ActionShowVersion handles the `SHOW VERSION` command. func ActionShowVersion(_ *dclish.Command) error { - fmt.Printf("BULLETIN Version %s\n", versioninfo.Version) + rev := versioninfo.Revision + if len(rev) > 7 { + rev = rev[len(rev)-7:] + } + fmt.Printf("BULLETIN Version 2.0.7g (%s)\n", rev) fmt.Printf("Linked on %s\n", versioninfo.LastCommit.Format("2006-05-04 15:02:01")) return nil