If you're going for ultramax efficiency, you may want to add a secondary handle_say type function to implement string slicing, that way you can hack off the "say " part of the said[] string. If you have a huge list of bad words to check against, I can imagine it would be checking those first four irrelevant cells countless times.
...or "say_team" for the say_team one.
Also, not sure there's a reason to use a charsmax function when you just defined how large the array was and could easily type it in...