Make checks pass
This commit is contained in:
parent
cf82d34507
commit
6b7bc306a8
|
@ -5,7 +5,7 @@ module Backend (
|
|||
import Backend.Config (BackendConfig, readConfig, users)
|
||||
import Control.Concurrent.STM.TQueue (TQueue, newTQueueIO, writeTQueue)
|
||||
import Control.Exception (try)
|
||||
import qualified Data.Aeson as Aeson
|
||||
import Data.Aeson qualified as Aeson
|
||||
import Data.Map (lookup)
|
||||
import Data.Password.Argon2
|
||||
import Frontend.Route (BackendRoute (..), FrontendRoute, fullRouteEncoder)
|
||||
|
|
|
@ -14,7 +14,7 @@ import Kassandra.RemoteBackendWidget (
|
|||
remoteBackendWidget,
|
||||
)
|
||||
import Kassandra.Types
|
||||
import qualified Reflex.Dom as D
|
||||
import Reflex.Dom qualified as D
|
||||
import Relude.Extra.Newtype
|
||||
|
||||
-- This runs in a monad that can be run on the client or the server.
|
||||
|
|
|
@ -9,7 +9,7 @@ import Prelude hiding (id, (.))
|
|||
import Control.Category
|
||||
-}
|
||||
|
||||
import qualified Control.Category
|
||||
import Control.Category qualified
|
||||
import Data.Text (Text)
|
||||
|
||||
-- import Data.Functor.Identity
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
|
||||
module Kassandra.AgendaWidget (agendaWidget) where
|
||||
|
||||
import qualified Data.Sequence as Seq
|
||||
import qualified Data.Sequence.NonEmpty as NESeq
|
||||
import Data.Sequence qualified as Seq
|
||||
import Data.Sequence.NonEmpty qualified as NESeq
|
||||
import Kassandra.BaseWidgets (br, button, icon)
|
||||
import Kassandra.Calendar (
|
||||
CalendarEvent (
|
||||
|
@ -26,8 +26,8 @@ import Kassandra.ListElementWidget (AdhocContext (..), definitionElementWidget,
|
|||
import Kassandra.ReflexUtil (listWithGaps)
|
||||
import Kassandra.TextEditWidget (createTextWidget)
|
||||
import Kassandra.Types (StandardWidget, Widget, getAppState)
|
||||
import qualified Reflex as R
|
||||
import qualified Reflex.Dom as D
|
||||
import Reflex qualified as R
|
||||
import Reflex.Dom qualified as D
|
||||
|
||||
agendaWidget :: StandardWidget t m r e => m ()
|
||||
agendaWidget = do
|
||||
|
|
|
@ -6,8 +6,8 @@ module Kassandra.BaseWidgets (
|
|||
) where
|
||||
|
||||
import Kassandra.Types (Widget)
|
||||
import qualified Reflex as R
|
||||
import qualified Reflex.Dom as D
|
||||
import Reflex qualified as R
|
||||
import Reflex.Dom qualified as D
|
||||
import Relude.Extra.Bifunctor (secondF)
|
||||
|
||||
br :: D.DomBuilder t m => m ()
|
||||
|
|
|
@ -20,7 +20,7 @@ import GHC.Stack (
|
|||
import Reflex as R
|
||||
import System.IO.Unsafe (unsafePerformIO)
|
||||
|
||||
import qualified Debug.Trace as Trace
|
||||
import Debug.Trace qualified as Trace
|
||||
import Relude.Extra.Bifunctor
|
||||
import Relude.Extra.Enum
|
||||
import Say
|
||||
|
|
|
@ -28,8 +28,8 @@ import Kassandra.Util (
|
|||
lookupTask,
|
||||
tellSingleton,
|
||||
)
|
||||
import qualified Reflex as R
|
||||
import qualified Reflex.Dom as D
|
||||
import Reflex qualified as R
|
||||
import Reflex.Dom qualified as D
|
||||
|
||||
tellSelected :: (MonadIO m, WriteApp t m e) => R.Event t (Seq DefinitionElement) -> m ()
|
||||
tellSelected = tellSingleton . fmap (_Typed @AppStateChange % _Typed @SelectState #) <=< logRShow Info
|
||||
|
|
|
@ -9,9 +9,9 @@ module Kassandra.ListElementWidget (
|
|||
selectWidget,
|
||||
) where
|
||||
|
||||
import qualified Data.HashMap.Strict as HashMap
|
||||
import qualified Data.Sequence as Seq
|
||||
import qualified Data.Set as Set
|
||||
import Data.HashMap.Strict qualified as HashMap
|
||||
import Data.Sequence qualified as Seq
|
||||
import Data.Set qualified as Set
|
||||
import Kassandra.BaseWidgets (br, button, icon)
|
||||
import Kassandra.Calendar (CalendarList, completed)
|
||||
import Kassandra.Config (
|
||||
|
@ -40,8 +40,8 @@ import Kassandra.TaskWidget (
|
|||
import Kassandra.TextEditWidget (createTextWidget)
|
||||
import Kassandra.Types (AppStateChange, DataChange (SetEventList), StandardWidget, TaskInfos, TaskState, getAppState, getSelectState, getTasks)
|
||||
import Kassandra.Util (tellNewTask, tellSingleton)
|
||||
import qualified Reflex as R
|
||||
import qualified Reflex.Dom as D
|
||||
import Reflex qualified as R
|
||||
import Reflex.Dom qualified as D
|
||||
|
||||
data AdhocContext = NoContext | AgendaEvent Text CalendarList | AgendaList Text (Set Text)
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ module Kassandra.ListWidget (
|
|||
listWidget,
|
||||
) where
|
||||
|
||||
import qualified Data.HashMap.Strict as HashMap
|
||||
import Data.HashMap.Strict qualified as HashMap
|
||||
import Kassandra.Config (DefinitionElement (TagList))
|
||||
import Kassandra.ListElementWidget (AdhocContext (NoContext), definitionElementWidget)
|
||||
import Kassandra.Types (
|
||||
|
@ -12,8 +12,8 @@ import Kassandra.Types (
|
|||
Widget,
|
||||
getTasks,
|
||||
)
|
||||
import qualified Reflex as R
|
||||
import qualified Reflex.Dom as D
|
||||
import Reflex qualified as R
|
||||
import Reflex.Dom qualified as D
|
||||
|
||||
listsWidget :: (StandardWidget t m r e) => m ()
|
||||
listsWidget = do
|
||||
|
|
|
@ -9,7 +9,7 @@ import Kassandra.Api (SocketMessage, SocketRequest)
|
|||
import Kassandra.Config (UserConfig)
|
||||
import Kassandra.State (ClientSocket)
|
||||
import Kassandra.Types (WidgetIO)
|
||||
import qualified Reflex as R
|
||||
import Reflex qualified as R
|
||||
|
||||
data LocalSocketState = LocalError Text | SettingUp deriving (Show)
|
||||
makePrismLabels ''LocalSocketState
|
||||
|
|
|
@ -10,7 +10,7 @@ import Kassandra.Config (
|
|||
import Kassandra.LocalBackend (LocalBackendRequest, localClientSocket)
|
||||
import Kassandra.State (StateProvider, makeStateProvider)
|
||||
import Kassandra.Types (WidgetIO)
|
||||
import qualified Reflex as R
|
||||
import Reflex qualified as R
|
||||
|
||||
localBackendWidget ::
|
||||
WidgetIO t m =>
|
||||
|
|
|
@ -4,10 +4,10 @@ module Kassandra.MainWidget (
|
|||
mainWidget,
|
||||
) where
|
||||
|
||||
import qualified Data.HashMap.Strict as HashMap
|
||||
import qualified Data.Sequence as Seq
|
||||
import qualified Data.Sequence.NonEmpty as NESeq
|
||||
import qualified Data.Set as Set
|
||||
import Data.HashMap.Strict qualified as HashMap
|
||||
import Data.Sequence qualified as Seq
|
||||
import Data.Sequence.NonEmpty qualified as NESeq
|
||||
import Data.Set qualified as Set
|
||||
import Kassandra.AgendaWidget (agendaWidget)
|
||||
import Kassandra.BaseWidgets (br, button)
|
||||
import Kassandra.Calendar (CalendarEvent)
|
||||
|
@ -37,8 +37,8 @@ import Kassandra.Types (
|
|||
getTime,
|
||||
)
|
||||
import Kassandra.Util (lookupTasks, stillTodo, tellNewTask)
|
||||
import qualified Reflex as R
|
||||
import qualified Reflex.Dom as D
|
||||
import Reflex qualified as R
|
||||
import Reflex.Dom qualified as D
|
||||
|
||||
mainWidget :: WidgetIO t m => StateProvider t m -> m ()
|
||||
mainWidget stateProvider = do
|
||||
|
|
|
@ -8,13 +8,13 @@ module Kassandra.ReflexUtil (
|
|||
keyDynamic,
|
||||
) where
|
||||
|
||||
import qualified Data.Map as Map
|
||||
import qualified Data.Patch.Map as Patch
|
||||
import Data.Map qualified as Map
|
||||
import Data.Patch.Map qualified as Patch
|
||||
|
||||
-- import qualified Data.Patch.MapWithMove as Patch
|
||||
import qualified Data.Sequence as Seq
|
||||
import qualified Reflex as R
|
||||
import qualified Reflex.Dom as D
|
||||
import Data.Sequence qualified as Seq
|
||||
import Reflex qualified as R
|
||||
import Reflex.Dom qualified as D
|
||||
|
||||
{- | Renders a list of widgets depending on a Dynamic list of inputs. This will
|
||||
call the widget constructor once per value in the list.
|
||||
|
|
|
@ -26,8 +26,8 @@ import Kassandra.State (
|
|||
)
|
||||
import Kassandra.Types (WidgetJSM)
|
||||
import Language.Javascript.JSaddle (liftJSM)
|
||||
import qualified Reflex as R
|
||||
import qualified Reflex.Dom as D
|
||||
import Reflex qualified as R
|
||||
import Reflex.Dom qualified as D
|
||||
import Relude.Extra.Newtype (un, wrap)
|
||||
import System.Process (readCreateProcess, shell)
|
||||
|
||||
|
|
|
@ -4,8 +4,8 @@ module Kassandra.SelectorWidget (
|
|||
|
||||
import Kassandra.Config (NamedBackend (..))
|
||||
import Kassandra.Types (Widget)
|
||||
import qualified Reflex as R
|
||||
import qualified Reflex.Dom as D
|
||||
import Reflex qualified as R
|
||||
import Reflex.Dom qualified as D
|
||||
|
||||
backendSelector ::
|
||||
Widget t m => NonEmpty (NamedBackend a) -> m (R.Dynamic t (NamedBackend a))
|
||||
|
|
|
@ -5,14 +5,14 @@ module Kassandra.Sorting (
|
|||
SortMode (SortModePartof, SortModeTag),
|
||||
) where
|
||||
|
||||
import qualified Data.Aeson as Aeson
|
||||
import Data.Aeson qualified as Aeson
|
||||
import Data.Scientific (toRealFloat)
|
||||
import qualified Data.Sequence as Seq
|
||||
import Data.Sequence qualified as Seq
|
||||
import Data.Set (member)
|
||||
import Kassandra.Types (TaskInfos)
|
||||
import qualified Reflex as R
|
||||
import Reflex qualified as R
|
||||
import Relude.Extra.Foldable1 (maximum1)
|
||||
import qualified Taskwarrior.Task as Task
|
||||
import Taskwarrior.Task qualified as Task
|
||||
|
||||
data SortMode = SortModePartof UUID | SortModeTag Task.Tag
|
||||
deriving stock (Show, Eq, Ord, Generic)
|
||||
|
|
|
@ -5,8 +5,8 @@ module Kassandra.State (
|
|||
DataState (..),
|
||||
) where
|
||||
|
||||
import qualified Data.HashMap.Strict as HashMap
|
||||
import qualified Data.Sequence as Seq
|
||||
import Data.HashMap.Strict qualified as HashMap
|
||||
import Data.Sequence qualified as Seq
|
||||
import Kassandra.Api (SocketMessage (..), SocketRequest (..))
|
||||
import Kassandra.Calendar
|
||||
import Kassandra.Config (UIConfig)
|
||||
|
@ -16,8 +16,8 @@ import Kassandra.Types (
|
|||
TaskState,
|
||||
WidgetIO,
|
||||
)
|
||||
import qualified Reflex as R
|
||||
import qualified Reflex.Dom as D
|
||||
import Reflex qualified as R
|
||||
import Reflex.Dom qualified as D
|
||||
import Taskwarrior.IO (createTask)
|
||||
|
||||
getParents :: HashMap UUID Task -> UUID -> Seq UUID
|
||||
|
|
|
@ -4,11 +4,11 @@ module Kassandra.TaskWidget (
|
|||
uuidWidget,
|
||||
) where
|
||||
|
||||
import qualified Data.HashSet as HashSet
|
||||
import qualified Data.Sequence as Seq
|
||||
import qualified Data.Sequence.NonEmpty as NESeq
|
||||
import qualified Data.Set as Set
|
||||
import qualified Data.Text as Text
|
||||
import Data.HashSet qualified as HashSet
|
||||
import Data.Sequence qualified as Seq
|
||||
import Data.Sequence.NonEmpty qualified as NESeq
|
||||
import Data.Set qualified as Set
|
||||
import Data.Text qualified as Text
|
||||
import Kassandra.BaseWidgets (
|
||||
br,
|
||||
button,
|
||||
|
@ -51,10 +51,10 @@ import Kassandra.Types (
|
|||
getTime,
|
||||
)
|
||||
import Kassandra.Util (lookupTaskM, lookupTasksDynM, lookupTasksM, stillTodo, tellNewTask, tellTask, tellToggle)
|
||||
import qualified Reflex as R
|
||||
import Reflex qualified as R
|
||||
import Reflex.Dom ((=:))
|
||||
import qualified Reflex.Dom as D
|
||||
import qualified Taskwarrior.Status as Status
|
||||
import Reflex.Dom qualified as D
|
||||
import Taskwarrior.Status qualified as Status
|
||||
import Taskwarrior.UDA (UDA)
|
||||
|
||||
type TaskWidget t m r e = (TaskTreeWidget t m r e, HaveTask m r)
|
||||
|
|
|
@ -11,8 +11,8 @@ import Kassandra.BaseWidgets (
|
|||
stateWidget,
|
||||
)
|
||||
import Kassandra.Types (Widget)
|
||||
import qualified Reflex as R
|
||||
import qualified Reflex.Dom as D
|
||||
import Reflex qualified as R
|
||||
import Reflex.Dom qualified as D
|
||||
|
||||
lineWidget :: Widget t m => Text -> m (R.Event t Text)
|
||||
lineWidget text = enterTextWidget text (showText text)
|
||||
|
|
|
@ -13,8 +13,8 @@ import Kassandra.Types (
|
|||
Widget,
|
||||
getTime,
|
||||
)
|
||||
import qualified Reflex as R
|
||||
import qualified Reflex.Dom as D
|
||||
import Reflex qualified as R
|
||||
import Reflex.Dom qualified as D
|
||||
|
||||
myFormatTime :: ZonedTime -> Text
|
||||
myFormatTime = toText . formatTime defaultTimeLocale "%Y-%m-%d %H:%M"
|
||||
|
|
|
@ -27,15 +27,15 @@ module Kassandra.Types (
|
|||
getExpandedTasks,
|
||||
) where
|
||||
|
||||
import qualified Data.Aeson as Aeson
|
||||
import Data.Aeson qualified as Aeson
|
||||
import Data.HashSet (member)
|
||||
import Kassandra.Calendar
|
||||
import Kassandra.Config (DefinitionElement, UIConfig)
|
||||
import Language.Javascript.JSaddle (MonadJSM)
|
||||
import qualified Reflex as R
|
||||
import qualified Reflex.Dom as D
|
||||
import qualified Taskwarrior.Status
|
||||
import qualified Taskwarrior.Task
|
||||
import Reflex qualified as R
|
||||
import Reflex.Dom qualified as D
|
||||
import Taskwarrior.Status qualified
|
||||
import Taskwarrior.Task qualified
|
||||
import Text.Show
|
||||
|
||||
type Widget t m =
|
||||
|
|
|
@ -30,8 +30,8 @@ import Kassandra.Types (
|
|||
getExpandedTasks,
|
||||
getTasks,
|
||||
)
|
||||
import qualified Reflex as R
|
||||
import qualified Reflex.Dom as D
|
||||
import Reflex qualified as R
|
||||
import Reflex.Dom qualified as D
|
||||
|
||||
stillTodo :: TaskInfos -> Bool
|
||||
stillTodo = has (#status % #_Pending)
|
||||
|
|
|
@ -75,7 +75,7 @@ import Data.Aeson (
|
|||
fromJSON,
|
||||
toJSON,
|
||||
)
|
||||
import qualified Data.Aeson as Aeson
|
||||
import Data.Aeson qualified as Aeson
|
||||
import Data.Generics.Product.Any (HasAny (the))
|
||||
import Data.Generics.Product.Fields (HasField' (field'))
|
||||
import Data.Generics.Product.Typed (HasType (typed))
|
||||
|
|
|
@ -7,13 +7,13 @@ module Kassandra.Backend.Calendar (
|
|||
saveCache,
|
||||
) where
|
||||
|
||||
import qualified Control.Concurrent.STM as STM
|
||||
import qualified Data.Aeson as JSON
|
||||
import qualified Data.ByteString.Lazy as LBS
|
||||
import Control.Concurrent.STM qualified as STM
|
||||
import Data.Aeson qualified as JSON
|
||||
import Data.ByteString.Lazy qualified as LBS
|
||||
import Data.Default (Default (def))
|
||||
import qualified Data.Map as Map
|
||||
import qualified Data.Set as Set
|
||||
import qualified Data.Text as Text
|
||||
import Data.Map qualified as Map
|
||||
import Data.Set qualified as Set
|
||||
import Data.Text qualified as Text
|
||||
import Data.Time (ZonedTime (ZonedTime), addDays, getCurrentTime, nominalDay, utc)
|
||||
import Data.Time.Zones (
|
||||
TZ,
|
||||
|
@ -22,9 +22,9 @@ import Data.Time.Zones (
|
|||
localTimeToUTCTZ,
|
||||
timeZoneForUTCTime,
|
||||
)
|
||||
import qualified StmContainers.Map as STM
|
||||
import StmContainers.Map qualified as STM
|
||||
import Streamly (IsStream, SerialT, async, asyncly, maxThreads)
|
||||
import qualified Streamly.Prelude as S
|
||||
import Streamly.Prelude qualified as S
|
||||
import System.Directory (
|
||||
XdgDirectory (XdgCache),
|
||||
createDirectoryIfMissing,
|
||||
|
@ -60,7 +60,7 @@ import Text.ICalendar (
|
|||
|
||||
import Control.Exception (onException)
|
||||
import Data.Aeson (decodeStrict', encode)
|
||||
import qualified DeferredFolds.UnfoldlM as UnfoldlM
|
||||
import DeferredFolds.UnfoldlM qualified as UnfoldlM
|
||||
import Kassandra.Calendar (
|
||||
CalendarEvent (..),
|
||||
CalendarList (CalendarList),
|
||||
|
@ -70,11 +70,11 @@ import Kassandra.Calendar (
|
|||
zonedDay,
|
||||
)
|
||||
import Kassandra.Debug (Severity (..), log)
|
||||
import qualified Streamly.Data.Fold as FL
|
||||
import Streamly.Data.Fold qualified as FL
|
||||
import Streamly.External.ByteString (fromArray, toArray)
|
||||
import qualified Streamly.FileSystem.Handle as FS
|
||||
import Streamly.FileSystem.Handle qualified as FS
|
||||
import Streamly.Internal.Data.Array.Stream.Foreign (splitOn)
|
||||
import qualified Streamly.Internal.FileSystem.File as FSFile
|
||||
import Streamly.Internal.FileSystem.File qualified as FSFile
|
||||
import Streamly.Memory.Array as Mem (fromList)
|
||||
|
||||
dirName :: FilePath
|
||||
|
|
|
@ -8,7 +8,7 @@ import Data.Password.Argon2 (
|
|||
Argon2,
|
||||
PasswordHash (PasswordHash),
|
||||
)
|
||||
import qualified Data.UUID as UUID
|
||||
import Data.UUID qualified as UUID
|
||||
import Dhall (
|
||||
Decoder,
|
||||
FromDhall,
|
||||
|
@ -20,7 +20,7 @@ import Dhall (
|
|||
input,
|
||||
toMonadic,
|
||||
)
|
||||
import qualified Dhall
|
||||
import Dhall qualified
|
||||
import Dhall.Core (pretty)
|
||||
import System.Environment ()
|
||||
|
||||
|
|
|
@ -23,8 +23,8 @@ import Kassandra.Standalone.State (localBackendProvider)
|
|||
import Kassandra.State (StateProvider)
|
||||
import Kassandra.Types (WidgetJSM)
|
||||
import Kassandra.Util (defDynDyn)
|
||||
import qualified Reflex as R
|
||||
import qualified Reflex.Dom as D
|
||||
import Reflex qualified as R
|
||||
import Reflex.Dom qualified as D
|
||||
import Relude.Extra.Newtype (wrap)
|
||||
import Say (say)
|
||||
import System.Exit (ExitCode (ExitFailure))
|
||||
|
|
|
@ -7,11 +7,11 @@ module Kassandra.Standalone.State (
|
|||
import Control.Concurrent.STM (TQueue, readTQueue)
|
||||
import Control.Concurrent.STM.TVar (stateTVar)
|
||||
import Control.Monad.STM (retry)
|
||||
import qualified Data.Aeson as Aeson
|
||||
import qualified Data.Map as Map
|
||||
import qualified Data.Sequence as Seq
|
||||
import qualified Data.Sequence.NonEmpty as NESeq
|
||||
import qualified Network.Simple.TCP as Net
|
||||
import Data.Aeson qualified as Aeson
|
||||
import Data.Map qualified as Map
|
||||
import Data.Sequence qualified as Seq
|
||||
import Data.Sequence.NonEmpty qualified as NESeq
|
||||
import Network.Simple.TCP qualified as Net
|
||||
import Say (say, sayErr)
|
||||
import Streamly (
|
||||
SerialT,
|
||||
|
@ -21,7 +21,7 @@ import Streamly (
|
|||
parallely,
|
||||
serial,
|
||||
)
|
||||
import qualified Streamly.Prelude as S
|
||||
import Streamly.Prelude qualified as S
|
||||
import Taskwarrior.IO (getTasks, saveTasks)
|
||||
|
||||
import Kassandra.Api (
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
module Main where
|
||||
|
||||
import qualified Data.List.Extra as L
|
||||
import Data.List.Extra qualified as L
|
||||
import Data.List.NonEmpty (
|
||||
groupBy,
|
||||
zip,
|
||||
|
@ -19,10 +19,10 @@ import Data.Text (
|
|||
intercalate,
|
||||
replace,
|
||||
)
|
||||
import qualified Data.Text as Text
|
||||
import qualified Data.Time.Calendar as T
|
||||
import qualified Data.Time.Clock as T
|
||||
import qualified Data.Time.Format as T
|
||||
import Data.Text qualified as Text
|
||||
import Data.Time.Calendar qualified as T
|
||||
import Data.Time.Clock qualified as T
|
||||
import Data.Time.Format qualified as T
|
||||
import Relude hiding (
|
||||
intercalate,
|
||||
zip,
|
||||
|
@ -31,10 +31,10 @@ import System.Environment ()
|
|||
import System.FilePattern.Directory (getDirectoryFiles)
|
||||
import Text.Atom.Feed
|
||||
import Text.Atom.Feed.Export (textFeed)
|
||||
import qualified Text.Megaparsec as MP
|
||||
import qualified Text.Megaparsec.Char as MP
|
||||
import qualified Text.Megaparsec.Char as MPC
|
||||
import qualified Text.Megaparsec.Char.Lexer as MP
|
||||
import Text.Megaparsec qualified as MP
|
||||
import Text.Megaparsec.Char qualified as MP
|
||||
import Text.Megaparsec.Char qualified as MPC
|
||||
import Text.Megaparsec.Char.Lexer qualified as MP
|
||||
|
||||
-- TODO: use Text instead of linked lists of chars
|
||||
|
||||
|
|
|
@ -1,2 +1 @@
|
|||
- [ ] Choose which branches you care about
|
||||
- [ ] Accept multiline commands
|
||||
|
|
|
@ -2,33 +2,33 @@
|
|||
|
||||
module Main (main) where
|
||||
|
||||
import qualified Control.Exception as Exception
|
||||
import Control.Exception qualified as Exception
|
||||
import Control.Monad.Catch (MonadMask)
|
||||
import qualified Control.Monad.Catch as MonadCatch
|
||||
import qualified Control.Monad.Except as Except
|
||||
import qualified Control.Monad.Logger as MonadLogger
|
||||
import qualified Control.Monad.Trans.Resource as ResourceT
|
||||
import Control.Monad.Catch qualified as MonadCatch
|
||||
import Control.Monad.Except qualified as Except
|
||||
import Control.Monad.Logger qualified as MonadLogger
|
||||
import Control.Monad.Trans.Resource qualified as ResourceT
|
||||
import Data.GraphQL (get)
|
||||
import qualified Data.GraphQL as GraphQL
|
||||
import qualified Data.List.NonEmpty as NonEmpty
|
||||
import qualified Data.Map.Strict as Map
|
||||
import qualified Data.Text as Text
|
||||
import qualified Data.Time as Time
|
||||
import Data.GraphQL qualified as GraphQL
|
||||
import Data.List.NonEmpty qualified as NonEmpty
|
||||
import Data.Map.Strict qualified as Map
|
||||
import Data.Text qualified as Text
|
||||
import Data.Time qualified as Time
|
||||
import Data.Yaml (FromJSON)
|
||||
import qualified Data.Yaml as Yaml
|
||||
import Data.Yaml qualified as Yaml
|
||||
import Database.Esqueleto.Experimental (notIn, (&&.), (<.), (==.), (^.))
|
||||
import qualified Database.Esqueleto.Experimental as SQL
|
||||
import qualified Database.Persist as Persist
|
||||
import qualified Database.Persist.Sqlite as Persist.Sqlite
|
||||
import qualified Database.Persist.TH as Persist
|
||||
import qualified Network.HTTP.Client as HTTP
|
||||
import qualified Network.Matrix.Client as Matrix
|
||||
import qualified NixpkgsBot.GraphQL.API as GraphQL.API
|
||||
import Database.Esqueleto.Experimental qualified as SQL
|
||||
import Database.Persist qualified as Persist
|
||||
import Database.Persist.Sqlite qualified as Persist.Sqlite
|
||||
import Database.Persist.TH qualified as Persist
|
||||
import Network.HTTP.Client qualified as HTTP
|
||||
import Network.Matrix.Client qualified as Matrix
|
||||
import NixpkgsBot.GraphQL.API qualified as GraphQL.API
|
||||
import Relude hiding (get)
|
||||
import qualified System.Clock as Clock
|
||||
import qualified System.Environment as System
|
||||
import qualified System.Process.Typed as Process
|
||||
import qualified System.Random as Random
|
||||
import System.Clock qualified as Clock
|
||||
import System.Environment qualified as System
|
||||
import System.Process.Typed qualified as Process
|
||||
import System.Random qualified as Random
|
||||
|
||||
data Repo = MkRepo
|
||||
{ localPath :: FilePath
|
||||
|
@ -517,8 +517,8 @@ getCommands roomId events = do
|
|||
session <- getEnv matrixSession
|
||||
members <- unwrapMatrixError $ Matrix.getRoomMembers session roomId
|
||||
let isQuery = Map.size members <= 2
|
||||
forM (toList messages) \(author, message) -> do
|
||||
let (cmd, args) = second (Text.drop 1) $ Text.breakOn " " $ Text.strip message
|
||||
join <$> forM (toList messages) \(author, message) -> forM (Text.lines message) \line -> do
|
||||
let (cmd, args) = second (Text.drop 1) $ Text.breakOn " " $ Text.strip line
|
||||
pure $ MkCommand{command = Text.toLower cmd, args, author, isQuery, roomId}
|
||||
where
|
||||
getCommand Matrix.RoomEvent{Matrix.reSender = Matrix.Author author, Matrix.reContent = Matrix.EventRoomMessage (Matrix.RoomMessageText (Matrix.MessageText{Matrix.mtBody, Matrix.mtType = Matrix.TextType}))} = Just (author, mtBody)
|
||||
|
@ -697,7 +697,7 @@ helpMessage = do
|
|||
, m "I will inform you, when one of the pull requests you subscribed to reaches one of these branches: " <> branchList
|
||||
, mempty
|
||||
, m "I have been programmed and am being hosted by " <> mention "@maralorn:maralorn.de" <> m ". Feel free to reach out to him, if you have any problems or suggestions."
|
||||
, m "My code is written in Haskell, is open source under the AGPL license and can be found at " <> link "https://git.maralorn.de/nixpkgs-bot" "git.maralorn.de/nixpkgs-bot" <> m "."
|
||||
, m "My code is written in Haskell, is open source under the AGPL license and can be found at " <> link "https://git.maralorn.de/nixos-config/tree/apps/nixpkgs-bot" "git.maralorn.de/nixos-config/tree/apps/nixpkgs-bot" <> m "."
|
||||
]
|
||||
|
||||
whenTimeIsUp :: (Environment -> IORef Clock.TimeSpec) -> Int64 -> App () -> App ()
|
||||
|
|
|
@ -38,6 +38,7 @@ common common-config
|
|||
TypeApplications
|
||||
TypeFamilies
|
||||
UndecidableInstances
|
||||
ImportQualifiedPost
|
||||
|
||||
build-depends:
|
||||
, aeson-schemas
|
||||
|
|
|
@ -8,10 +8,10 @@ import Relude
|
|||
import Witch
|
||||
|
||||
import Data.Aeson (FromJSON (..), Value (Array, String), withObject)
|
||||
import qualified Data.Aeson.Key as Key
|
||||
import qualified Data.Aeson.KeyMap as Aeson
|
||||
import qualified Data.Foldable as Foldable
|
||||
import qualified Data.Text as Text
|
||||
import Data.Aeson.Key qualified as Key
|
||||
import Data.Aeson.KeyMap qualified as Aeson
|
||||
import Data.Foldable qualified as Foldable
|
||||
import Data.Text qualified as Text
|
||||
import Data.Yaml (decodeFileEither)
|
||||
|
||||
import System.Posix.Daemon (Redirection (DevNull), runDetached)
|
||||
|
|
10
flake.nix
10
flake.nix
|
@ -32,7 +32,14 @@
|
|||
};
|
||||
pre-commit = {
|
||||
check.enable = true;
|
||||
settings.hooks = {
|
||||
settings = {
|
||||
settings.ormolu.defaultExtensions = [
|
||||
"TypeApplications"
|
||||
"BangPatterns"
|
||||
"ImportQualifiedPost"
|
||||
"BlockArguments"
|
||||
];
|
||||
hooks = {
|
||||
hlint.enable = true;
|
||||
alejandra.enable = true;
|
||||
nix-linter.enable = false; # Too many false positives for now
|
||||
|
@ -43,4 +50,5 @@
|
|||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -7,14 +7,14 @@
|
|||
{-# LANGUAGE TemplateHaskell #-}
|
||||
{-# LANGUAGE NoImplicitPrelude #-}
|
||||
|
||||
import qualified Control.Concurrent
|
||||
import qualified Control.Concurrent as Concurrent
|
||||
import qualified Control.Concurrent.Async as Async
|
||||
import qualified Control.Concurrent.STM as STM
|
||||
import Control.Concurrent qualified
|
||||
import Control.Concurrent qualified as Concurrent
|
||||
import Control.Concurrent.Async qualified as Async
|
||||
import Control.Concurrent.STM qualified as STM
|
||||
import Control.Exception (catch, onException)
|
||||
import qualified Data.ByteString.Lazy as LBS
|
||||
import Data.ByteString.Lazy qualified as LBS
|
||||
import Data.String.Interpolate (i)
|
||||
import qualified Data.Text as Text
|
||||
import Data.Text qualified as Text
|
||||
import Relude
|
||||
import Say (sayErr)
|
||||
import Shh (ExecReference (Absolute), captureTrim, exe, ignoreFailure, load, (|>))
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
{-# LANGUAGE BlockArguments #-}
|
||||
{-# LANGUAGE ExtendedDefaultRules #-}
|
||||
{-# LANGUAGE FlexibleContexts #-}
|
||||
{-# LANGUAGE ImportQualifiedPost #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
{-# LANGUAGE QuasiQuotes #-}
|
||||
{-# LANGUAGE ScopedTypeVariables #-}
|
||||
|
@ -10,7 +11,7 @@
|
|||
{-# OPTIONS_GHC -Wall -Werror -Wno-missing-signatures -Wno-type-defaults -Wno-orphans #-}
|
||||
|
||||
import Data.String.Interpolate
|
||||
import qualified Data.Text as Text
|
||||
import Data.Text qualified as Text
|
||||
import Language.Haskell.TH
|
||||
import Language.Haskell.TH.Syntax
|
||||
import Relude
|
||||
|
|
|
@ -70,6 +70,7 @@ in {
|
|||
{-# LANGUAGE TupleSections #-}
|
||||
{-# LANGUAGE PartialTypeSignatures #-}
|
||||
{-# LANGUAGE BlockArguments #-}
|
||||
{-# LANGUAGE ImportQualifiedPost #-}
|
||||
|
||||
import Shh
|
||||
import Relude
|
||||
|
|
Loading…
Reference in a new issue