diff --git a/IRC/Plugins/Loader.hs b/IRC/Plugins/Loader.hs index ea0f3e6..4d9dbc9 100644 --- a/IRC/Plugins/Loader.hs +++ b/IRC/Plugins/Loader.hs @@ -14,24 +14,29 @@ import Encoding type PluginSet = M.HashMap String Plugin -data Plugin = Plugin { wew :: Int, - lad :: Int } - -load :: PluginSet -> IO (Either String (IO PluginSet)) -load = do initObjLinker RetainCAFs - loadObj "Plugin.o" - _ret <- resolveObjs - ptr <- lookupSymbol (mangleSymbol Nothing "Plugin" "f") - case ptr of - Nothing -> return $ Left "Couldn’t load symbol" - Just (Ptr addr) -> case addrToAny# addr of - (# f #) -> return $ Right f - -unload :: String -> IO PluginSet -unload plugin = catch (unloadObj $ plugin <> ".o") exceptionHandler - -exceptionHandler :: ErrorCall -> IO PluginSet -exceptionHandler _ = return () +data Plugin = Plugin { pluginEvent :: String, -- e.g. PRIVMSG + pluginEntry :: Int } + +load :: PluginSet -> String -> IO (Either String PluginSet) +load set path = do + initObjLinker RetainCAFs + loadObj "Plugin.o" + _ret <- resolveObjs + ptr <- lookupSymbol (mangleSymbol Nothing "Plugin" "f") + case ptr of + Nothing -> return $ Left "Couldn’t load symbol" + Just (Ptr addr) -> case addrToAny# addr of + (# f #) -> return $ Right f + +unload :: PluginSet -> String -> IO PluginSet +unload set plugin = catch unloadPlugin exceptionHandler + where exceptionHandler :: ErrorCall -> IO PluginSet + exceptionHandler _ = return set + + unloadPlugin :: IO PluginSet + unloadPlugin = do + unloadObj $ plugin <> ".o" + return $ M.delete plugin set mangleSymbol :: Maybe String -> String -> String -> String mangleSymbol pkg module' valsym =