X-Git-Url: https://git.martlubbers.net/?p=cloogle-irc.git;a=blobdiff_plain;f=cloogle.icl;h=ad150618fa1495743f4ebde113ce6338d2c4c105;hp=fa3bb50c8385ce6fc04d925680c58e8aadd8ea8b;hb=aaa56cd1806d5543053f74258dbdaa9dde252b98;hpb=e044cfaa625c5b38ab18a481c20eb743fccb285d diff --git a/cloogle.icl b/cloogle.icl index fa3bb50..ad15061 100644 --- a/cloogle.icl +++ b/cloogle.icl @@ -2,12 +2,12 @@ module cloogle import Cloogle import GenPrint -import IRC import StdEnv import Data.Functor import Data.Maybe -from Data.Func import $ +import Data.Either +from Data.Func import $, mapSt from Text import class Text(..), instance Text String, instance + String import Text.JSON @@ -26,12 +26,14 @@ import Data.Functor import Data.Tuple import TCPIP +import IRC +import IRCBot commands :: [String] commands = map toString - [NICK "clooglebot" - ,USER "cloogle" 0 "Cloogle bot" - ,JOIN [("#cloogle", Nothing)] + [NICK "clooglebot" Nothing + ,USER "cloogle" "0" "cloogle" "Cloogle bot" + ,JOIN (CSepList ["#cloogle"]) Nothing ] TIMEOUT :== Just 10000 @@ -81,7 +83,7 @@ import StdMisc import StdDebug doRequestL :: HTTPRequest Int *World -> *(MaybeErrorString HTTPResponse, *World) -doRequestL req 0 w = (Error "Maximal redirect numbe exceeded", w) +doRequestL req 0 w = (Error "Maximal redirect number exceeded", w) doRequestL req maxRedirects w | not (trace_tn $ toString req) = undef # (er, w) = doRequest req w @@ -132,7 +134,7 @@ cloogle data w # resp = fromOk mer = case fromJSON $ fromString resp.HTTPResponse.rsp_data of Nothing = ("couldn't parse json", w) - Just clr = ("Results for " + data + " -- https://cloogle.org/#" + urlEncode data + "\n" + + Just clr = ("Results for " + data + " -- https://cloogle.org/#" + replaceSubString "+" "%20" (urlEncode data) + "\n" + processResults clr, w) where processResults :: Response -> String @@ -142,14 +144,14 @@ cloogle data w processResult :: Result -> String processResult (FunctionResult (br, {func})) - = "Function in " +++ br.library +++ ": " +++ br.modul +++ " - " +++ func + = "Function in " +++ br.library +++ ": " +++ br.modul +++ "\n" +++ func processResult (TypeResult (br, {type})) - = "Type in " +++ br.library +++ ": " +++ br.modul +++ " - " +++ limitResults type + = "Type in " +++ br.library +++ ": " +++ br.modul +++ "\n" +++ limitResults type processResult (ClassResult (br, {class_name,class_funs})) - = "Class in " +++ br.library +++ ": " +++ br.modul +++ " - " +++ class_name +++ " with " + = "Class in " +++ br.library +++ ": " +++ br.modul +++ "\n" +++ class_name +++ " with " +++ toString (length class_funs) +++ " class functions" - processResult (MacroResult (br, {macro_name})) - = "Macro in " +++ br.library +++ ": " +++ br.modul +++ " - " +++ macro_name + //processResult (MacroResult (br, {macro_name})) + // = "Macro in " +++ br.library +++ ": " +++ br.modul +++ "\n" +++ macro_name processResult (ModuleResult (br, _)) = "Module in " +++ br.library +++ ": " +++ br.modul @@ -164,75 +166,63 @@ cloogle data w | size s > 80 = subString 0 77 s + "..." = s -send :: [String] TCP_DuplexChannel *World -> (TCP_DuplexChannel, *World) -send [] chan w = (chan, w) -send [msg:msgs] {sChannel,rChannel} w -# (rpt,i,sChannel,w) = send_MT TIMEOUT (toByteSeq msg) sChannel w -| rpt <> TR_Success = abort "Could not send request\n" -= send msgs {sChannel=sChannel,rChannel=rChannel} w - -recv :: TCP_DuplexChannel *World -> (Maybe String, TCP_DuplexChannel, *World) -recv {sChannel,rChannel} w -# (rpt, resp, rChannel, w) = receive_MT TIMEOUT rChannel w -| rpt == TR_Expired = (Nothing, {sChannel=sChannel,rChannel=rChannel}, w) -| rpt == TR_NoSuccess || isNothing resp = abort "Halp?\n" -= (toString <$> resp, {sChannel=sChannel,rChannel=rChannel}, w) - -msg :: (String -> IRCCommands) -msg = PRIVMSG "#cloogle" - -process :: *File TCP_DuplexChannel *World -> (*File, TCP_DuplexChannel, *World) -process io chan w -# (mr, chan, w) = recv chan w -| isNothing mr = process io chan w -# resp = fromJust mr -#! io = io <<< ("Received: " +++ resp +++ "\n") -# ind = indexOf KEY resp -| ind >= 0 - # cmd = split " " $ rtrim $ subString (ind + size KEY) (size resp) resp - #! io = io <<< ("Received command: " +++ printToString cmd +++ "\n") - # (w, toSend) = case cmd of - ["stop":_] = (w, Nothing) - ["ping":xs] = (w, Just [msg $ "pong " +++ join " " xs]) - ["query":xs] - # (s, w) = cloogle (join " " xs) w - = (w, Just $ map msg $ split "\n" s) - ["short"] = (w, Just [msg $ "short requires an url argument"]) - ["short":xs] - # (s, w) = shorten (join " " xs) w - = (w, Just [msg s]) - ["help"] = (w, Just - [msg "type !help cmd for command specific help" - ,msg "available commands: help, ping, query, short"]) - ["help":c:_] = (w, case c of - "help" = Just [msg "help [CMD] - I will print general help or the help of CMD"] - "ping" = Just [msg "ping [TXT] - I will reply with pong and the optionar TXT"] - "query" = Just [msg "query QUERY - I will send QUERY to cloogle and post the results"] - "short" = Just [msg "short URL - I will give the url to https://cloo.gl shortening service and post back the result"] - _ = Just [msg "Unknown command"]) - [c:_] = (w, Just [msg $ join " " ["unknown command: " , c, ", type !help to get help"]]) - | isNothing toSend = (io, chan, w) - # (chan, w) = send (map toString $ fromJust toSend) chan w - = process io chan w -| indexOf "PING :" resp >= 0 - # cmd = rtrim $ subString (indexOf "PING :" resp + size "PING :") (size resp) resp - #! io = io <<< (toString $ PONG cmd Nothing) <<< "\n" - # (chan, w) = send [toString $ PONG cmd Nothing] chan w - = process io chan w -= process io chan w - -Start :: *World -> *World -Start w -# (io, w) = stdio w -# (ip, w) = lookupIPAddress SERVER w -| isNothing ip = abort $ "DNS lookup for " +++ SERVER +++ " failed\n" -# (Just ip) = ip -# (rpt,chan,w) = connectTCP_MT TIMEOUT (ip, 6667) w -| rpt == TR_Expired = abort $ "Connection to " +++ SERVER +++ " timed out\n" -| rpt == TR_NoSuccess = abort $ "Could not connect to " +++ SERVER +++ "\n" -# chan = fromJust chan -# (chan, w) = send commands chan w -# (io, chan, w) = process io chan w -# ({sChannel,rChannel}, w) = send [toString $ QUIT Nothing] chan w -# (_, w) = fclose io w -= closeChannel sChannel (closeRChannel rChannel w) + +Start :: *World -> (MaybeErrorString (), *World) +Start w = bot ("irc.freenode.net", 6667) startup shutdown () process w + where + toPrefix c = {irc_prefix=Nothing,irc_command=Right c} + startup = map toPrefix + [NICK "clooglebot" Nothing + ,USER "cloogle" "cloogle" "cloogle" "Cloogle bot" + ,JOIN (CSepList ["#cloogle"]) Nothing] + shutdown = map toPrefix [QUIT $ Just "Bye"] + + process :: IRCMessage () *World -> (Maybe [IRCMessage], (), *World) + process im s w = case im.irc_command of + Left numr = (Just [], (), w) + Right cmd = case process` cmd w of + (Nothing, w) = (Nothing, (), w) + (Just cs, w) = (Just $ map toPrefix cs, (), w) + + process` :: IRCCommand *World -> (Maybe [IRCCommand], *World) + process` (PRIVMSG t m) w + | m.[0] == '!' + # (msgs, w) = realProcess (split " " $ m % (1, size m)) w + = (Just $ map (PRIVMSG t) msgs, w) + = (Nothing, w) + process` (PING t mt) w = (Just [PONG t mt], w) + process` _ w = (Just [], w) + + realProcess :: [String] *World -> ([String], *World) + realProcess ["help",x:xs] w = ((case x of + "help" = + [ "Usage: !help [ARG]" + , "Show this help, or the specific help of the argument"] + "ping" = + [ "Usage: !ping [ARG [ARG ...]]" + , "Ping the bot, it will pong the arguments back"] + "shorten" = + [ "Usage: !shorten URL [URL [URL ...]]" + , "Shorten the given urls with the cloo.gl url shortener"] + "query" = + [ "Usage: !query QUERY" + , "Query QUERY in cloogle and return the results"] + "restart" = + [ "Usage: !restart" + , "Restart the bot"] + x = ["Unknown command: " +++ x] + ), w) + realProcess ["help"] w = ( + ["Type !help cmd for command specific help" + ,"available commands: help, ping, shorten, query"], w) + realProcess ["ping":xs] w = (["pong " +++ join " " xs], w) + realProcess ["shorten":xs] w = case xs of + [] = (["shorten requires at least one argument"], w) + xs = mapSt shorten xs w + realProcess ["query":xs] w = case xs of + [] = (["query requires one or more arguments"], w) + xs = (["Not implemented yet..."], w) + realProcess ["restart"] w = abort "Restarted" + realProcess ["restart":_] w = (["restart takes no arguments"], w) + realProcess [c:_] w = ([join " " [ + "Unknown cmd: ", c, ", type !help to get help"]], w)