Advertisement
Guest User

Untitled

a guest
Jul 20th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- | Check if a packet matches a certain event.
  2. checkEvent :: Event -> Packet -> Bool
  3. checkEvent evt pkt =
  4.     let matches = M.fromList -- (event, main packet, packet body)
  5.           [ (AnyEvent, (Anything, Anything))
  6.           , recv Recv Anything
  7.           , recv RecvJoin $ Cmd "join"
  8.           , recv RecvPart $ Cmd "part"
  9.           , recv RecvPrivchg $ Cmd "privchg"
  10.           , recv RecvKicked $ Cmd "kicked"
  11.           , recv RecvAdmin $ Cmd "admin"
  12.           , recv RecvMsg $ Cmd "msg"
  13.           , recv RecvAction $ Cmd "action"
  14.           , recv AdminShow $ Head "admin" "show"
  15.           , recv AdminShowPc $ HeadArgs "admin" "show" [("p", "privclass")]
  16.           , recv AdminShowUsers $ HeadArgs "admin" "show" [("p", "users")]
  17.           , recv AdminRename $ Head "admin" "rename"
  18.           , recv AdminRemove $ Head "admin" "remove"
  19.           , recv AdminMove $ Head "admin" "move"
  20.           , recv AdminUpdate $ Head "admin" "update"
  21.           , recv AdminCreate $ Head "admin" "create"
  22.           , (Property, (Cmd "property", Anything))
  23.           , prop PropertyPc "privclasses"
  24.           , prop PropertyTitle "title"
  25.           , prop PropertyTopic "topic"
  26.           , prop PropertyMembers "members"
  27.           , prop PropertyInfo "info"
  28.           , (DAmnServer, (Cmd "dAmnServer", Anything))
  29.           , (LoginError, (Cmd "login", Anything))
  30.           , (JoinError, (Cmd "join", Anything))
  31.           , (PartError, (Cmd "part", Anything))
  32.           , (SendError, (Cmd "send", Anything))
  33.           , (GetError, (Cmd "get", Anything))
  34.           , (SetError, (Cmd "set", Anything))
  35.           , (KickError, (Cmd "kick", Anything))
  36.           , (Disconnect, (Cmd "disconnect", Anything))
  37.           , (Ping, (Cmd "ping", Anything))
  38.           , (Kicked, (Cmd "kicked", Anything)) ]
  39.         recv :: Event -> EventMatch -> (Event, (EventMatch, EventMatch))
  40.         recv e match = (e, (Cmd "recv", match))
  41.         prop :: Event -> ByteString -> (Event, (EventMatch, EventMatch))
  42.         prop e arg = (e, (CmdArgs "property" [("p", arg)], Anything))
  43.         pktMatch = matches ! evt
  44.         check pkt match =
  45.             case match of
  46.                  Anything -> True
  47.                  Cmd c -> pktCmd pkt == c
  48.                  Param p -> pktParam pkt == p
  49.                  Head c p -> pktCmd pkt == c && pktParam pkt == p
  50.                  Args a -> M.fromList a `M.isSubmapOf` pktArgs pkt
  51.                  CmdArgs c a ->
  52.                      pktCmd pkt == c
  53.                   && M.fromList a `M.isSubmapOf` pktArgs pkt
  54.                  ParamArgs p a ->
  55.                      pktParam pkt == p
  56.                   && M.fromList a `M.isSubmapOf` pktArgs pkt
  57.                  HeadArgs c p a ->
  58.                      pktCmd pkt == c
  59.                   && pktParam pkt == c
  60.                   && M.fromList a `M.isSubmapOf` pktArgs pkt
  61.     in check pkt (fst pktMatch)
  62.     && check (makePacket $ pktBody pkt) (snd pktMatch)
  63.  
  64. -- | Run all of the event hooks in the client that match the given packet.
  65. runHooks :: Packet -> ClientIO Client
  66. runHooks pkt =
  67.     do hooks <- asks cEventHooks
  68.        client <- ask
  69.        ReaderT $ \_ -> fst $ M.mapAccumWithKey runHooks' (return client) hooks
  70.       where runHooks' cli id hook =
  71.                  if checkEvent (fst hook) pkt
  72.                     -- run the hook with the accumulated client
  73.                     then (cli >>= runReaderT ((snd hook) $ EventInfo pkt (fst hook)), ())
  74.                     else (cli, ())
  75.  
  76. -- | Run the event hooks that match a list of packets.
  77. runHooksList :: [Packet] -> ClientIO Client
  78. runHooksList [] = ask
  79. runHooksList (x:xs) =
  80.     do cli <- runHooks x
  81.        ReaderT $ \_ -> runReaderT (runHooksList xs) cli
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement