Based on the assumption that $1 is the string you mentioned, if the $1 token contains the quotes, you'll need to use $noqt($1) in place of $1 to remove the surrounding quotes. You can use $gettok(string,token-number,delimiter-ascii) to find part of the token, then if the ! is touching the receiver, you'll need to use either $remove(user!,!) to remove all !'s or remove only the last character with $left(user!,-1)

I don't know twitch, so I don't know whether it's possible for them to have "!" as part of the nick. So if you know that user! is the 7th word, you can the the user without the "!" with $left( $gettok($1,7,32) ,-1)

If the sentence can be a variety of sentences but the user! is always the last token by using token -1 instead of 7. If the only thing you know is that user! follows the word 'to' you can use $findtok($1,to,1,32) to find which token is the word 'to' then add 1 to that.

If Userwhogifted is the first word always, you can get it either the way you're getting it, or get the 1st token of $1 with $gettok($1,1,32).

32 is the $asc() of the space character, so if tokens are delimited by commas use 44. The other most common delimiter is the period, which is ASCII 46.

Summary:
Code:
msg $chan giver is $gettok($noqt($1),1,32) receiver is $remove($gettok($noqt($1),7,32),!)