You could overwrite GM:PlayerChat() [i think that’s the right hook] and pass the arguments with the tag before the message.
[editline]21st January 2013[/editline]
As for the scoreboard, you could do something like this:
[lua]local function GetThatRank(ply)
if ply:IsUserGroup(“mod”) then return “Moderator”
else return “Guest”
then in the scoreboard, instead of displaying the player’s name, display GetThatRank(ply)…ply:Name()
Obviously that will only work for the “mod” user-group, and wouldn’t work with every admin mod.