Возможно причина в незафиксированный транзакции.
У вас есть такой код cursor.execute("UPDATE users
По идее после любого update нужно вызывать connection.commit() - фиксировать транзакцию.
Если этого не делать то баланс игрока не будет меняться при выигрышах и поражениях
Ну и из-за этого проверка на выход за пределы лимита не срабатывает потому что выхода за пределы по факту нет.
Ну и код проверки баланса странный, coursor.execute("select возвращает кортеж или None, а вы сравниваете его с set судя по коду.
Лучше переписать запрос и передать параметры не через форматирование строки, чтобы если что не ловить sql инъекции.
Попробуйте строку:
if cursor.execute("SELECT gems from users where id = {}".format(ctx.author.id)).fetchone() < {amount}:
Переписать так:
if not cursor.execute("SELECT 1 FROM users WHERE id = ? AND gems >= ?), (ctx.author.id, amount)).fetchone():