I've moved this to OffTopic because
1) ULX, basically already does what you're asking, your just asking to have it done differently (therefore, not a ULX help question)
2) You don't seem to be asking how it can be done in code, only can it be done (therefore, not quite a developers corner question)
Yes, all you ask can be done using lua.
I personally don't see the reason for changing a, c or tsay in ULX.
There are many code discussions in the release thread for chat tags.
Though chat tags isn't quite the same as what you want, the code used/discussed there would be best learning/starting point.
Compare it to ULX's own asay, csay and tsay command code, and you get the best mix of how it's done. (Though, you'd have to write your own '/' command parser)