Due to operator precedence or has lower binding precedence than does and. For example a similar expression to yours is:
a or b and c
which is interpreted as shown by the parentheses:
a or (b and c)
because and has higher precedence. In this case the expression will always be True if a is True, and the sub-expression (b and c) will not be evaluated. So it makes no difference what the sub-expression evaluates to and thus changing the value of c will not affect the result (N.B when a is True).
So, for your expression, whenever username == "ssj3goku878" is True, the value of msg has no bearing on the overall result and you will find that both if statements execute their bodies.
To correct this, you should explicitly add parentheses to override the default precedences:
if ((username == "ssj3goku878") or (username == "mgnlive")) and msg == "!load":
keyholder.holdForSeconds("F7", 1)
You probably have more than 2 users and would prefer not to have to alter your program whenever a new user is added, so this might be preferable:
users = ["ssj3goku878", "mgnlive", "user3"]
if username in users and msg == '!load':
keyholder.holdForSeconds("F7", 1)
The users list can be populated from a file, database or other persistent source. In this case in has higher precedence than and so parentheses are not required, however, it is often easier to explicitly add parentheses than it is for you (or whomever is reading your code) to remember (or lookup) the precedences, so this is usually better:
if (username in users) and msg == '!load':