- data Digit
- ppDigit :: Digit -> Char
- ppEscapeDigits :: [Digit] -> String
- digitsToInteger :: [Digit] -> Maybe Integer
- data AGI a
- run :: AGI a -> Handler -> IO a
- fastAGI :: Maybe PortID -> (HostName -> PortNumber -> AGI a) -> IO ()
- runInternal :: AGI a -> Handle -> Handle -> IO a
- data SoundType
- sendRecv :: Command -> AGI String
- answer :: AGI Bool
- hangUp :: Maybe String -> AGI Bool
- getData :: FilePath -> Maybe Integer -> Maybe Integer -> AGI (Maybe ([Digit], Bool))
- data RecordResult
- = FailureToWrite
- | FailureOnWaitFor
- | HangUp
- | Interrupted Digit
- | Timeout
- | RandomError String
- sayDigits :: [Digit] -> [Digit] -> AGI (Maybe (Maybe Digit))
- sayNumber :: Integer -> [Digit] -> AGI (Maybe (Maybe Digit))
- streamFile :: FilePath -> [Digit] -> Maybe Integer -> AGI (Either Integer (Maybe Digit, Integer))
- waitForDigit :: Integer -> AGI (Maybe (Maybe Digit))
- record :: FilePath -> SoundType -> [Digit] -> Maybe Integer -> Maybe Integer -> Bool -> Maybe Integer -> AGI (RecordResult, Integer)
Documentation
DTMF digits
ppEscapeDigits :: [Digit] -> StringSource
convert a list of Digit
s into a quoted string.
The quoted string format is used by many AGI commands
digitsToInteger :: [Digit] -> Maybe IntegerSource
run :: AGI a -> Handler -> IO aSource
Top-level wrapper for single-shot AGI scripts.
Example:
main = run yourAGI Ignore
fastAGI :: Maybe PortID -> (HostName -> PortNumber -> AGI a) -> IO ()Source
Top-level for long running AGI scripts.
Example:
main = fastAGI Nothing yourAGI
You should be sure to compile with -threaded. Note that yourAGI
may be running simultaneously in multiple threads, so you will need
some concurrency control for shared data.
TODO: support a hang-up handler
runInternal :: AGI a -> Handle -> Handle -> IO aSource
runInternal - run an AGI script using the supplied Handles for input and output
You probably want run
or fastAGI
. This function is exposed so
that 3rd party libraries such as HAppS can easily add support for
FastAGI support.
TODO: support general method of handling extra arguments (query_string vs command-line arguments)
sendRecv :: Command -> AGI StringSource
send an AGI Command, and return the Response
this function provides the low-level send/receive functionality.
answer
channel if not already in answer state
hangUp the specified channel
:: FilePath | file to stream |
-> Maybe Integer | timout in ms after keypress (default: 2000 ms) |
-> Maybe Integer | max |
-> AGI (Maybe ([Digit], Bool)) | Nothing on failure, Just (digits, timeout) on success |
play a file and return and digits pressed
See also: streamFile
data RecordResult Source
:: [Digit] | digits to say |
-> [Digit] | digits which can stop playback |
-> AGI (Maybe (Maybe Digit)) | Nothing on error, Just Nothing on success. Just (Just digit) if interrupted. |
say the given digit string
:: Integer | number to say |
-> [Digit] | return early if any of these digits are received |
-> AGI (Maybe (Maybe Digit)) | Nothing on failure, Just Nothing on success, Just (Just digit) if key is pressed |
sayNumber
says the specified number
:: FilePath | file to stream |
-> [Digit] | escape digits |
-> Maybe Integer | sample offset |
-> AGI (Either Integer (Maybe Digit, Integer)) | On failure: Left endpos. On success: Right (Maybe Digit, endpos) |
playback the specified file, can be interupted by the given digits.
See also: getData
:: Integer | timeout in milliseconds, -1 to block indefinitely |
-> AGI (Maybe (Maybe Digit)) | |Nothing| on error, |Just Nothing| on timeout, |Just (Just digit)| on success |
wait for channel to receive a DTMF digit.
See also: getData
for multiple digits
:: FilePath | record to this file |
-> SoundType | |GSM | WAV| |
-> [Digit] | stop recording if one of these digits is entered |
-> Maybe Integer | maximum record time in milliseconds, -1 for no timeout |
-> Maybe Integer | offset samples |
-> Bool | beep to indicate recording has begun |
-> Maybe Integer | stop recording if this many seconds of silence passes |
-> AGI (RecordResult, Integer) | exit condition, endpos=offset |
record channel to a file