The /desc command doesn't print who sent it. The first argument to sendChat is essentially ignored in this case. The issue here is that the script is reacting to a /roll command, and printing a message after it. The script doesn't (and cannot) do anything to the output of the /roll command. If your "As" dropdown is selecting you the player, your /roll will report as such. If you select a character you have control of, the /roll command will use that character. David T. said: Or, if rolling as a Character (not a Token) is good enough, you can replace "player|"+e.playerid wherever you see e.who and then you can choose a Character to roll as in the drop-down box below the Chat window. Using an arbitrary string as the first parameter to sendChat is equivalent to using /as or /emas; while it will print the name you've selected, the message isn't actually associated with a character. If you want to actually send a message as a character, the parameter needs to be 'character|'+characterid. Here's an example of a function that will figure out who to send a message as: function automaticSendChat(msgObj, message, callback) { const characters = findObjs({type: 'character'}); let speaking; characters.forEach((chr) => (chr.get('name') === msgObj.who) && (speaking = chr)); if (speaking) sendChat(`character|${speaking.id}`, message, callback); else sendChat(`player|${msgObj.playerid}`, message, callback); } // usage: on('chat:message', function(msg) { automaticSendChat(msg, '/em said something'); });