R      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu v w x y z { | } ~        None %&<=DLR&Regular expression wrapper for marvin.(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone %&<=DLR A match to a @. Index 0 is the full match, all other indexes are match groups.@Abstract Wrapper for a reglar expression implementation. Has an  < implementation, so literal strings can be used to create a . Alternatively use # to create one with custom options.Compile a regex with optionsNormally it is sufficient to just write the regex as a plain string and have it be converted automatically, but if you want certain match options you can use this function.IMatch a regex against a string and return the first match found (if any).    $Random numbers and utility functions(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone %&<=DLR 2Generate a random value. For more information see  !2Generate a random value frbounded by a range. See   for how the range works."=Get a random value out of an integer indexed sequence, like (Vector , '[a]', Seq or Set) This uses the sequences 9 and therefore does not terminate for infinite sequences.(Uses the global random number generator.)Usable in all IO capable monads, such as  BotReacting and ScriptDefinition. !"   !" !" !"Mutable references for marvin.(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone %&<=DLR #:A value that can be shared on multiple concurrent Threads.QThis value works like a channel. It can either be empty or full. If it is empty -6 fills it, otherwise the write blocks. If it is full +3 empties, otherwise it blocks until it is filled. )* does not empty it and also blocks if the # is empty.cShould you just use it as a thread safe mutable variable, mutations typically follow the pattern:  val <- takeSynchronized -- obtain the value and leave it empty to block concurrent reads let mod = modify val -- modify the value writeSynchronized val -- write back the result Another use for this type is as a message channel, where we have a producer and a consumer, the producer tries to write values into the # (-") and the consumer waits for the #" to be filled and takes the value + for procesing.It works generally best if any #A is only used for one of these two applications at the same time.This type is the same as e, only renamed for readability. If you want a more in depth documentation, see the documentation for .$'A mutable reference to a value of type vThis is like a pointer in c, the value behind which can be mutated by several functions. So long as they retain this reference they are able to retrieve the updated value.%'Create a new mutable reference of type v from an initial value.&1Retrieve the value behind by a mutable reference.')Set the value inside a mutable reference.(,Change the value behind a mutable reference.)#Read the vaue, but don't empty the #. Blocks if it is empty.*Non blocking version of ) . Returns  if it was empty.+Read the value and empty the #, blocks if already empty.,Non blocking version of + , returns  if it was empty.-Fills the empty #$ with a value, blocks if it is full..Non blocking version of - . Returns   if it was full./ Query if the # is empty or full. #$%&'()*+,-./ #$%&'()*+,-./ $%&'(#)*+,-./ #$%&'()*+,-./Working with json in marvin(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone %&<=DLR01S!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopq010101 +Performing http/https requests from scripts(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone %&<=DLRNone%&9;<=?DILR2QIdentifier for a channel (internal and not necessarily equal to the channel name)4JIdentifier for a user (internal and not necessarily equal to the username)A;Denotes a place from which we may access the configuration.RDuring script definition or when handling a request we can obtain the config with  getConfigVal or requireConfigVal.FaA type, basically a String, which identifies an adapter to the config and the logging facilities.I_A type, basically a String, which identifies a script to the config and the logging facilities.L3contents and meta information of a recieved message%2345=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^2345?@ABCDEFGHIJKLMQONPRSTUV'4523==^^RSTLMNOPQ]\IJKFGH[ZUEVYXCDAB?@W2345=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^ Common types in marvin.(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone %&<=DLR2345?@AIJKLMQONPU4523LMNOPQIJKU?@@AThe adapter interface(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone%&9;<=DLRTe+Basic functionality required of any adapterf#Used for scoping config and logginggAPost a message to a channel given the internal channel identifierhInitialize and run the boti5Resolve a username given the internal user identifierjTResolve the human readable name for a channel given the internal channel identifierkFResolve to the internal channel identifier given a human readable nameo6Representation for the types of events which can occurefghijklmnopqrstEegijfhklmnopqrstopqrslnmEefghijktefghijklmnopqrst @Adapter for communicating with Slack via its real time event API(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone#%&9;<=?DLRJrstuvwxyz{|}~uvw{}+rstuvwxyz{|}~uvw{ }None%&9:;<=?DILORT"FRead only data available to a handler when the bot reacts to an event.VPayload in the reaction Monad when triggered by a message. Contains a field for the L and a field for the  from the .,Both fields are accessible directly via the  and  functions or this data via .,An abstract type describing a marvin script.1This is basically a collection of event handlers.@Internal structure is exposed for people wanting to extend this.<Monad for reacting in the bot. Allows use of functions like ,  and  as well as any arbitrary  action using .The type parameter dY is the accessible data provided by the trigger for this action and can be obtained with  or other custom functions like  and 8 which typically depend on a particular type of data in d. For message handlers like  and  this would be a regex  and a L for instance.For completeness: a is the adapter type and r/ is the return type of the monadic computation.This is also a  instance, there you can inspect the entire state of this reaction. This is typically only used in internal or utility functions and not necessary for the user. To inspect particular pieces of this state refer to the *Lenses* section.?Class which says that there is a way to get to a topic of type  from this type m.1Class which says that there is a way to get to a  from this type m.1Class which says that there is a way to get to a L from this type m.SInitializer for a script. This gets run by the server during startup and creates a !A monad for gradually defining a  using  and  as well as any  action.FWhenever any message matches the provided regex this handler gets run.#Equivalent to "robot.hear" in hubot8Runs the handler only if the bot was directly addressed.&Equivalent to "robot.respond" in hubot)This handler runs whenever a user enters  any channel! (which the bot is subscribed to)IThe payload contains the entering user and the channel which was entered.(This handler runs whenever a user exits  any channel! (which the bot is subscribed to)GThe payload contains the exiting user and the channel which was exited.)This handler runs whenever a user enters the specified channel.8The argument is the human readable name for the channel.'The payload contains the entering user.(This handler runs whenever a user exits the specified channel<, provided the bot is subscribed to the channel in question.8The argument is the human readable name for the channel.%The payload contains the exting user.$This handler runs when the topic in  any channel" the bot is subscribed to changes.GThe payload contains the new topic and the channel in which it was set.$This handler runs when the topic in the specified channelG is changed, provided the bot is subscribed to the channel in question.0The argument is the human readable channel name.Extension point for the user8Allows you to handle the raw event yourself. Returning e from the trigger function means you dont want to react to the event. The value returned inside the ) is available in the handler later using .?Send a message to the channel the triggering message came from.#Equivalent to "robot.send" in hubot&Get the username of a registered user.)Get the human readable name of a channel.qSend a message to the channel the original message came from and address the user that sent the original message.$Equivalent to "robot.reply" in hubot%Send a message to a Channel (by name)Define a new script for marvinYou need to provide a ScriptId (which can simple be written as a non-empty string). This id is used as the key for the section in the bot config belonging to this script and in logging output.0Roughly equivalent to "module.exports" in hubot.Obtain the event reaction data.KThe type of this data depends on the reaction function used. For instance  and  will contain W. The actual contents comes from the event itself and was put together by the trigger.5Get the results from matching the regular expression.#Equivalent to "msg.match" in hubot.Get the message that triggered this action Includes sender, target channel, as well as the full, untruncated text of the original messageGet the the new topic.3Get the stored channel in which something happened.4Get the user whihc was part of the triggered action.'Get a value out of the config, returns  if the value didn't exist.This config is the config for this script. Ergo all config vars registered under the config section for the ScriptId of this script.The Ad Constraint means this function can be used both during script definition and when a handler is run.WGet a value out of the config and fail with an error if the specified key is not found.This config is the config for this script. Ergo all config vars registered under the config section for the ScriptId of this script.The Ad Constraint means this function can be used both during script definition and when a handler is run.Take a reaction and produce an IO action with the same effect. Useful for creating actions which can be scheduled to execute a certain time or asynchronous. The idea is that one can conveniently send messages from inside a schedulable action.Take an action and produce an IO action with the same effect. Useful for creating actions which can be scheduled to execute a certain time or asynchronous. The idea is that one can conveniently send messages from inside a schedulable action.hWoI  Running marvin.(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone#%&9:;<=?DLORT\"Create a wai compliant application;Runs the marvin bot using whatever method the adapter uses.(eeMarvin the modular bot(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone %&<=DLR324ILMQONPe3IeLMNOPQ424A collection of all modules useful for using marvin.(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone %&<=DLR!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopq          !"#$%&'()*+,-./0124ILMQONPe    !" #$%&'%&(%&)%&*%&+%&,%&-%&.%&/%&0%&123456789:;<=>?@ABCDEFGHIJJKKLMNOPQRSTUVWXYZ[\\]^^_``abcdeefghijklmnopqrstuvwxyz{|}~  {}|y                  3 !"#$%&'()*+,-./01201301401501601708908:08;08<08=08>08?08@0AB0AC0AD0AE0AF0AG0AH0AI0AJ0AK0AL0MN0MO0MP0QR0QS0QT0QU0QV0QW0QX0QY0QZ0Q[0Q\0Q]0Q^0Q_0Q`0Qa0bc0bd0ef0eg0eh0ei0ej0ek0el0em0en0eo0el0em0ep0eq0er0es0et0eu0ev0ev0ew0ex0ex0ey0ez0e{0e|0e}0e~0e0e0e0e0e0e                       j                                          -.p                                         !" !" !# !$ !% !& !'(#marvin-0.0.5-3MwTRtAykGIBFvmfJR7BWBMarvin.InternalMarvin.PreludeMarvin.Util.RegexMarvin.Util.RandomMarvin.Util.MutableMarvin.Util.JSONMarvin.Internal.TypesMarvin.AdapterMarvin.Adapter.Slack Marvin.RunUtilMarvin.Util.HTTP Marvin.TypesMarvinBotActionStateMessageReactionDataScriptbaseControl.Monad.IO.ClassliftIOMonadIO Control.MonadunlessData.Traversablefor Data.Foldablefor_ Data.Maybe fromMaybeGHC.Basewhen/marvin-interpolate-0.4.0-3kR5iA0guV3LhNII8Tp2oOMarvin.Interpolate.Text.LazyisLMarvin.Interpolate.TextisT'text-icu-0.7.0.1-IFmYf5LSfEX1gxaRkgfWq9Data.Text.ICU.Regex.Internal StackLimit WorkLimitErrorOnUnknownEscapes UnicodeWord HaskellLines MultilineLiteralDotAllCommentsCaseInsensitive MatchOptionMatchRegexrmatch$fIsStringRegex $fShowRegex randomValrandomValFromRange randomFrom SynchronizedMutable newMutable readMutable writeMutable modifyMutablereadSynchronizedtryReadSynchronizedtakeSynchronizedtryTakeSynchronizedwriteSynchronizedtryWriteSynchronizedisEmptySynchronizedreadJSON writeJSONChannelUser$fIsStringUser$fEqUser$fHashableUser$fIsStringChannel $fEqChannel $fShowChannel$fHashableChannel$fFromJSONUser $fToJSONUserIsScript getScriptIdHasConfigAccessgetConfigInternal HasScriptIdscriptIdRunnerM AdapterIdunwrapAdapterIdScriptIdunwrapScriptIdMessagesenderchannelcontent timestamp TimeStampunwrapTimeStampapplicationScriptIdverifyIdString$fConfiguredLogLevel$fIsStringAdapterId$fIsStringScriptId$fShowTAdapterId$fShowTScriptId$fToJSONTimeStamp$fFromJSONTimeStamp$fFromJSONChannel$fToJSONChannel$fShowTimeStamp$fShowScriptId $fEqScriptId$fShowAdapterId $fEqAdapterId IsAdapter adapterIdmessageChannelrunWithAdapter getUsernamegetChannelNameresolveChannelRunWithAdapterInitEventHandler EventHandlerEvent MessageEventChannelJoinEventChannelLeaveEventTopicChangeEventliftAdapterAction $fToJSONURI $fFromJSONURI $fHasTopicLimitedChannelInfoText$fHasNameLimitedChannelInfoText%$fHasIdValueLimitedChannelInfoChannel$fShowLimitedChannelInfo$fHasUsernameUserInfoText$fHasIdValueUserInfoUser$$fHasNameResolverChannelCacheHashMap!$fHasInfoCacheChannelCacheHashMapSlackRTMAdapter$fIsAdapterSlackRTMAdapter$fFromJSONRTMData$fToJSONRTMData HasVariablevariable HasConfigconfig HasAdapteradapter$fHasVariableBotActionStated#$fHasScriptIdBotActionStateScriptId$fHasConfigBotActionStateConfig$fHasAdapterBotActionStatea BotReacting runReaction WrappedAction ActionDataHearRespondJoinJoinInLeave LeaveFromTopicCTopicCInCustomTopicHasMessageField messageField HasMatchField matchField+$fHasMessageFieldMessageReactionDataMessage$$fHasMatchFieldMessageReactionData[]$fMonadBotReacting$fMonadIOBotReacting$fApplicativeBotReacting$fFunctorBotReacting$fMonadReaderBotReacting$fMonadLoggerBotReacting AccessAdapterAdapterT getAdapterHasUseruserLens HasChannel channelLensHasTopic topicLensHasMatch matchLens HasMessage messageLens ScriptInitScriptDefinition runScript HasActionsactionsidLens getSubConfFor getConfig addReactionhearrespondenterexitenterInexitFromtopictopicIn customTriggersendreplymessageChannel' defineScriptrunDefinitionsgetDatagetMatch getMessagegetTopic getChannelgetUser getConfigValrequireConfigVal getAppConfiggetAppConfigValrequireAppConfigValextractReaction extractAction$fAccessAdapterBotReacting$fAccessAdapterScriptDefinition$fIsScriptBotReacting$fIsScriptScriptDefinition$fHasConfigAccessBotReacting!$fHasConfigAccessScriptDefinition$fHasUserMessageReactionData $fHasUser(,) $fHasUserUser$fHasChannelMessageReactionData$fHasChannel(,) $fHasTopic(,) $fHasMatchm $fHasMessagem$fHasScriptIdScriptScriptId$fHasConfigScriptConfig$fHasAdapterScripta$fHasActionsScript[]$fMonadScriptDefinition$fMonadIOScriptDefinition$fApplicativeScriptDefinition$fFunctorScriptDefinition$fMonadLoggerScriptDefinitiondefaultConfigNamerequireFromAppConfiglookupFromAppConfig runMarvin!$fHasTopicChangeInHandlersHashMap$fHasTopicChangeHandlersf$fHasRespondsHandlersf$fHasLeavesFromHandlersHashMap$fHasLeavesHandlersf$fHasJoinsInHandlersHashMap$fHasJoinsHandlersf$fHasHearsHandlersf$fHasCustomsHandlersf LoggingFnnotImplemented addPrefixadaptLoggingSourceloggingAddSourcePrefix Data.StringIsString unwrapRegex!random-1.1-54KmMHXjttlERYcr1mvsAe System.RandomrandomrandomRlength getStdRandom newStdGen getStdGen setStdGenmkStdGen RandomGensplitnextgenRangeStdGenRandomrandomRsrandoms randomRIOrandomIOGHC.MVarMVarNothingghc-prim GHC.TypesFalse%aeson-0.11.2.1-1eeLSTWyHDJAIvlea47Q3E Data.Aeson.TH mkParseJSONderiveFromJSON mkToEncodingmkToJSON deriveToJSON deriveJSON Data.AesoneitherDecodeStrict' eitherDecode'eitherDecodeStrict eitherDecode decodeStrict'decode' decodeStrictdecodeData.Aeson.Types.Instances.!=.:!.:?.:fromJSONwithBoolwithScientific withNumber withArraywithText withObjectData.Aeson.Encode.FunctionspairsfoldableencodeData.Aeson.Types.ClassgenericParseJSONgenericToEncoding genericToJSONGToJSONgToJSON GToEncoding gToEncoding GFromJSON gParseJSONToJSONtoJSON toEncodingFromJSON parseJSONKeyValue.=Data.Aeson.Parser.Internaljson'jsonData.Aeson.Types.InternaldefaultTaggedObjectdefaultOptionsobjectResultErrorSuccessObjectArrayValueBoolStringNumberNullEncoding fromEncodingSeries DotNetTimefromDotNetTimeOptionsfieldLabelModifierconstructorTagModifierallNullaryToStringTagomitNothingFields sumEncodingunwrapUnaryRecords SumEncoding TaggedObjectObjectWithSingleField TwoElemArray tagFieldNamecontentsFieldNameLimitedChannelInfoUserInfo ChannelCache APIResponse responseOkpayloadRTMDataokurlHasNamename HasIdValueidValue HasUsernameusername InternalType UnhandeledIgnoredChannelArchiveStatusChangeChannelCreatedChannelDeleted ChannelRename UserChangecodemsgHasNameResolver nameResolver HasInfoCache infoCache sendMessage userConfig midTracker channelChache userInfoCache messageParser eventParserrawBS helloParseruserInfoParserapiResponseParserrunConnectionLooprunHandlerLoopsendMessageImpl runnerImpl execAPIMethodnewMidmessageChannelImplgetUserInfoImplrefreshUserInfo lciParser lciListParserrefreshChannelsresolveChannelImplgetChannelNameImpl putChannel deleteChannel renameChannelIO mtl-2.2.1-6qsR1PHUy5lL47Hpoa4jCMControl.Monad.Reader.Class MonadReaderJust applicationHandlers CmdOptions configPathverbosedebugdefaultBotNamedefaultLoggingLevelHasTopicChangeIn topicChangeInHasTopicChange topicChange HasRespondsresponds HasLeavesFrom leavesFrom HasLeavesleaves HasJoinsInjoinsInHasJoinsjoinsHasHearshears HasCustomscustomsmapHandlerFunctormkApp addAction runBotActionrunMessageActiononScriptExceptsetLoggingLevelIn(fast-logger-2.4.7-JQtH8rgnB8g7QmG4MGRXbXSystem.Log.FastLogger.LogStrLogStrToLogStrtoLogStr+monad-logger-0.3.20.1-H5eMUz1Gph4m2puCgRiN7Control.Monad.Logger logOtherCS logErrorCS logWarnCS logInfoCS logDebugCS logOtherNS logErrorNS logWarnNS logInfoNS logDebugNS logOtherN logErrorNlogWarnNlogInfoN logDebugN filterLoggerwithChannelLoggerunChanLoggingTrunChanLoggingTrunStdoutLoggingTrunStderrLoggingT defaultLogStr logOtherS logErrorSlogWarnSlogInfoS logDebugSliftLoc logOtherSH logErrorSH logWarnSH logInfoSH logDebugSHlogOtherlogErrorlogWarnlogInfologDebugLogLevel LevelDebug LevelInfo LevelWarn LevelError LevelOther LogSource MonadLoggermonadLoggerLog MonadLoggerIO askLoggerIO NoLoggingT runNoLoggingTLoggingT runLoggingTtemplate-haskellLanguage.Haskell.TH.SyntaxLocloc_end loc_start loc_module loc_package loc_filename