2024-06-02 07:53:13 +01:00
// SPDX-FileCopyrightText: 2024 Dan Anglin <d.n.i.anglin@gmail.com>
//
// SPDX-License-Identifier: GPL-3.0-or-later
2024-05-23 18:06:49 +01:00
package executor
2024-02-27 19:52:59 +00:00
import (
"flag"
"fmt"
2024-05-31 05:22:17 +01:00
"strconv"
2024-02-27 19:52:59 +00:00
"codeflow.dananglin.me.uk/apollo/enbas/internal/client"
"codeflow.dananglin.me.uk/apollo/enbas/internal/model"
2024-05-31 00:11:02 +01:00
"codeflow.dananglin.me.uk/apollo/enbas/internal/utilities"
2024-02-27 19:52:59 +00:00
)
2024-05-23 18:06:49 +01:00
type CreateExecutor struct {
2024-02-27 19:52:59 +00:00
* flag . FlagSet
2024-05-23 18:06:49 +01:00
topLevelFlags TopLevelFlags
2024-05-30 18:46:33 +01:00
boostable bool
federated bool
likeable bool
replyable bool
2024-05-31 05:22:17 +01:00
sensitive * bool
2024-05-30 18:46:33 +01:00
content string
contentType string
2024-05-31 00:11:02 +01:00
fromFile string
2024-05-30 18:46:33 +01:00
language string
spoilerText string
2024-02-27 19:52:59 +00:00
resourceType string
listTitle string
listRepliesPolicy string
2024-05-30 18:46:33 +01:00
visibility string
2024-02-27 19:52:59 +00:00
}
2024-05-23 18:06:49 +01:00
func NewCreateExecutor ( tlf TopLevelFlags , name , summary string ) * CreateExecutor {
createExe := CreateExecutor {
2024-02-27 19:52:59 +00:00
FlagSet : flag . NewFlagSet ( name , flag . ExitOnError ) ,
2024-05-22 23:30:09 +01:00
topLevelFlags : tlf ,
2024-02-27 19:52:59 +00:00
}
2024-05-30 18:46:33 +01:00
createExe . BoolVar ( & createExe . boostable , flagEnableReposts , true , "specify if the status can be reposted/boosted by others" )
createExe . BoolVar ( & createExe . federated , flagEnableFederation , true , "specify if the status can be federated beyond the local timelines" )
createExe . BoolVar ( & createExe . likeable , flagEnableLikes , true , "specify if the status can be liked/favourited" )
createExe . BoolVar ( & createExe . replyable , flagEnableReplies , true , "specify if the status can be replied to" )
createExe . StringVar ( & createExe . content , flagContent , "" , "the content of the status to create" )
createExe . StringVar ( & createExe . contentType , flagContentType , "plain" , "the type that the contents should be parsed from (valid values are plain and markdown)" )
2024-05-31 00:11:02 +01:00
createExe . StringVar ( & createExe . fromFile , flagFromFile , "" , "the file path where to read the contents from" )
2024-05-30 18:46:33 +01:00
createExe . StringVar ( & createExe . language , flagLanguage , "" , "the ISO 639 language code for this status" )
createExe . StringVar ( & createExe . spoilerText , flagSpoilerText , "" , "the text to display as the status' warning or subject" )
createExe . StringVar ( & createExe . visibility , flagVisibility , "" , "the visibility of the posted status" )
2024-05-23 18:06:49 +01:00
createExe . StringVar ( & createExe . resourceType , flagType , "" , "specify the type of resource to create" )
createExe . StringVar ( & createExe . listTitle , flagListTitle , "" , "specify the title of the list" )
createExe . StringVar ( & createExe . listRepliesPolicy , flagListRepliesPolicy , "list" , "specify the policy of the replies for this list (valid values are followed, list and none)" )
2024-02-27 19:52:59 +00:00
2024-05-31 05:22:17 +01:00
createExe . BoolFunc ( flagSensitive , "specify if the status should be marked as sensitive" , func ( value string ) error {
boolVal , err := strconv . ParseBool ( value )
if err != nil {
2024-06-02 08:50:47 +01:00
return fmt . Errorf ( "unable to parse %q as a boolean value: %w" , value , err )
2024-05-31 05:22:17 +01:00
}
createExe . sensitive = new ( bool )
* createExe . sensitive = boolVal
return nil
} )
2024-05-23 18:06:49 +01:00
createExe . Usage = commandUsageFunc ( name , summary , createExe . FlagSet )
2024-02-27 19:52:59 +00:00
2024-05-23 18:06:49 +01:00
return & createExe
2024-02-27 19:52:59 +00:00
}
2024-05-23 18:06:49 +01:00
func ( c * CreateExecutor ) Execute ( ) error {
2024-02-27 19:52:59 +00:00
if c . resourceType == "" {
2024-05-23 18:06:49 +01:00
return FlagNotSetError { flagText : flagType }
2024-02-27 19:52:59 +00:00
}
2024-05-23 18:06:49 +01:00
gtsClient , err := client . NewClientFromConfig ( c . topLevelFlags . ConfigDir )
2024-02-27 19:52:59 +00:00
if err != nil {
2024-06-02 08:50:47 +01:00
return fmt . Errorf ( "unable to create the GoToSocial client: %w" , err )
2024-02-27 19:52:59 +00:00
}
funcMap := map [ string ] func ( * client . Client ) error {
2024-05-30 18:46:33 +01:00
resourceList : c . createList ,
resourceStatus : c . createStatus ,
2024-02-27 19:52:59 +00:00
}
doFunc , ok := funcMap [ c . resourceType ]
if ! ok {
2024-05-23 18:06:49 +01:00
return UnsupportedTypeError { resourceType : c . resourceType }
2024-02-27 19:52:59 +00:00
}
return doFunc ( gtsClient )
}
2024-05-23 18:06:49 +01:00
func ( c * CreateExecutor ) createList ( gtsClient * client . Client ) error {
2024-02-27 19:52:59 +00:00
if c . listTitle == "" {
2024-05-23 18:06:49 +01:00
return FlagNotSetError { flagText : flagListTitle }
2024-02-27 19:52:59 +00:00
}
2024-06-02 08:50:47 +01:00
parsedListRepliesPolicy , err := model . ParseListRepliesPolicy ( c . listRepliesPolicy )
if err != nil {
return err
2024-02-27 19:52:59 +00:00
}
2024-05-30 20:04:55 +01:00
form := client . CreateListForm {
Title : c . listTitle ,
RepliesPolicy : parsedListRepliesPolicy ,
}
list , err := gtsClient . CreateList ( form )
2024-02-27 19:52:59 +00:00
if err != nil {
2024-06-02 11:03:51 +01:00
return fmt . Errorf ( "unable to create the list: %w" , err )
2024-02-27 19:52:59 +00:00
}
fmt . Println ( "Successfully created the following list:" )
2024-05-31 21:18:11 +01:00
utilities . Display ( list , * c . topLevelFlags . NoColor )
2024-02-27 19:52:59 +00:00
return nil
}
2024-05-30 18:46:33 +01:00
func ( c * CreateExecutor ) createStatus ( gtsClient * client . Client ) error {
var (
2024-05-31 00:11:02 +01:00
err error
content string
2024-05-30 18:46:33 +01:00
language string
visibility string
2024-05-31 05:22:17 +01:00
sensitive bool
2024-05-30 18:46:33 +01:00
)
2024-05-31 00:11:02 +01:00
switch {
case c . content != "" :
content = c . content
case c . fromFile != "" :
content , err = utilities . ReadFile ( c . fromFile )
if err != nil {
2024-06-02 08:50:47 +01:00
return fmt . Errorf ( "unable to get the status contents from %q: %w" , c . fromFile , err )
2024-05-31 00:11:02 +01:00
}
default :
return EmptyContentError {
ResourceType : resourceStatus ,
Hint : "please use --" + flagContent + " or --" + flagFromFile ,
}
}
2024-05-30 18:46:33 +01:00
preferences , err := gtsClient . GetUserPreferences ( )
if err != nil {
2024-06-02 08:50:47 +01:00
fmt . Println ( "WARNING: Unable to get your posting preferences: %w" , err )
2024-05-30 18:46:33 +01:00
}
if c . language != "" {
language = c . language
} else {
language = preferences . PostingDefaultLanguage
}
if c . visibility != "" {
visibility = c . visibility
} else {
visibility = preferences . PostingDefaultVisibility
}
2024-05-31 05:22:17 +01:00
if c . sensitive != nil {
sensitive = * c . sensitive
} else {
sensitive = preferences . PostingDefaultSensitive
}
2024-06-02 09:50:22 +01:00
parsedVisibility , err := model . ParseStatusVisibility ( visibility )
if err != nil {
return err
2024-05-30 18:46:33 +01:00
}
2024-06-02 10:38:30 +01:00
parsedContentType , err := model . ParseStatusContentType ( c . contentType )
if err != nil {
return err
2024-05-30 18:46:33 +01:00
}
form := client . CreateStatusForm {
2024-05-31 00:11:02 +01:00
Content : content ,
2024-05-30 18:46:33 +01:00
ContentType : parsedContentType ,
Language : language ,
SpoilerText : c . spoilerText ,
Boostable : c . boostable ,
Federated : c . federated ,
Likeable : c . likeable ,
Replyable : c . replyable ,
2024-05-31 05:22:17 +01:00
Sensitive : sensitive ,
2024-05-30 18:46:33 +01:00
Visibility : parsedVisibility ,
}
status , err := gtsClient . CreateStatus ( form )
if err != nil {
2024-06-02 08:50:47 +01:00
return fmt . Errorf ( "unable to create the status: %w" , err )
2024-05-30 18:46:33 +01:00
}
fmt . Println ( "Successfully created the following status:" )
2024-05-31 21:18:11 +01:00
utilities . Display ( status , * c . topLevelFlags . NoColor )
2024-05-30 18:46:33 +01:00
return nil
}