brainboxdotcc/DPP

set_presence() giving error 4002: decode error

ThiaudioTT opened this issue · 6 comments

Git commit reference
https://github.com/brainboxdotcc/DPP/tree/v10.0.29

Describe the bug
if we do:

	bot.on_ready([&bot](auto event) {
		if (dpp::run_once<struct register_bot_commands>()) {
			bot.global_command_create(
				dpp::slashcommand("ping", "Ping pong!", bot.me.id)
			);
		}
        // bot.set_presence(dpp::presence(dpp::ps_online, dpp::at_game, "with your heart"));
        bot.set_presence(dpp::presence()); // this will cause the error
	});

The bot will start to going online and offline in an infinite loop because of this.

WARN: OOF! Error from underlying websocket: 4002: Decode error

To Reproduce

Call:
bot.set_presence(dpp::presence());

Expected behavior

It should produce a runtime error to indicate failure. Options to address this issue could be removing this constructor or implementing a precondition in cluster.cpp.

System Details:

  • OS: Ubuntu 22.04

Additional context

void cluster::set_presence(const dpp::presence &p) {
	json pres = p.to_json();
	std::string presence = pres.dump();
	std::cout << "Setting presence: " << presence << std::endl; // Setting presence: {"d":{"afk":false,"since":null,"status":"offline"},"op":3}
	for (auto& s : shards) {
		if (s.second->is_connected()) {
			s.second->queue_message(s.second->jsonobj_to_string(pres));
		}
	}
}

I'm not quite sure I understand this, are you saying doing bot.set_presence(dpp::presence()); causes the infinite loop?

I'm not quite sure I understand this, are you saying doing bot.set_presence(dpp::presence()); causes the infinite loop?

I think not. The loop happens because bot.set_presence(dpp::presence()); is called inside bot.on_ready(). bot.start tries to connect again when a fail occurs, resulting in the loop.

The main problem here is that calling bot.set_presence(dpp::presence()); returns an error. That's all.

I used the same snippet in https://github.com/brainboxdotcc/DPP?tab=readme-ov-file#example

I didn't mention that.

I'm not quite sure I understand this, are you saying doing bot.set_presence(dpp::presence()); causes the infinite loop?

I think not. The loop happens because bot.set_presence(dpp::presence()); is called inside bot.on_ready(). bot.start tries to connect again when a fail occurs, resulting in the loop.

The main problem here is that calling bot.set_presence(dpp::presence()); returns an error. That's all.

Ah yeah I meant that, figured it was looping cuz the on_ready, just meant does the empty presence cause the issue lol

Yeah, this doesn't really seem like a bug as it's right (and some might argue it's completely fine as is), it just could be presented better and maybe not force a bot restart!

I'll work on a PR for that tomorrow :)

A PR is now open for this!

This is now fixed! Sending an empty presence will now pass An empty presence was passed to set_presence. to your console!