concommand or hook question

What the code to bind hooks to a chat say like:

!open - opens a derma menu

basically the came as what ULX does with !menu

I should know this but my brain has gone blank at the moment…

Thanks

On the server



local function PlayerRequestMenu(ply, text, team)
    if string.sub(text, 1, 5) == "!open" then
        umsg.Start("OpenDermaMsg", ply)
        umsg.End()
    end
end
hook.Add("PlayerSay", "PlayerRequestMenu", PlayerRequestMenu)


On the client



local function GetDermaMsg(msg)
    --open derma menu
end
usermessage.Hook("OpenDermaMsg", GetDermaMsg)


ahh thanks…