fffff got that logic finally
This commit is contained in:
		
							
								
								
									
										110
									
								
								ngc_hs1.cpp
									
									
									
									
									
								
							
							
						
						
									
										110
									
								
								ngc_hs1.cpp
									
									
									
									
									
								
							| @@ -12,22 +12,19 @@ struct _GroupID { | ||||
| 	std::array<uint8_t, TOX_GROUP_CHAT_ID_SIZE> data; | ||||
|  | ||||
| 	_GroupID(void) = default; | ||||
| 	_GroupID(const _GroupID& other) : data(other.data) { | ||||
| 		fprintf(stderr, "gcopy\n"); | ||||
| 		assert(data.data() != other.data.data()); | ||||
| 		assert(data[0] == other.data[0]); | ||||
| 		assert(data[1] == other.data[1]); | ||||
| 	} | ||||
| 	_GroupID(const _GroupID& other) : data(other.data) {} | ||||
| 	_GroupID(_GroupID&&) = delete; | ||||
| 	//_GroupID(_GroupID&& other) : data(std::move(other.data)) {} | ||||
|  | ||||
| 	bool operator<(const _GroupID& rhs) const { | ||||
| 		for (size_t i = 0; i < data.size(); i++) { | ||||
| 			if (data[i] >= rhs.data[i]) { | ||||
| 			if (data[i] < rhs.data[i]) { | ||||
| 				return true; | ||||
| 			} else if (data[i] > rhs.data[i]) { | ||||
| 				return false; | ||||
| 			} | ||||
| 		} | ||||
| 		return true; | ||||
| 		return false; // equal | ||||
| 	} | ||||
|  | ||||
| 	bool operator==(const _GroupID& rhs) const { | ||||
| @@ -49,11 +46,13 @@ struct _PeerID { | ||||
|  | ||||
| 	bool operator<(const _PeerID& rhs) const { | ||||
| 		for (size_t i = 0; i < data.size(); i++) { | ||||
| 			if (data[i] >= rhs.data[i]) { | ||||
| 			if (data[i] < rhs.data[i]) { | ||||
| 				return true; | ||||
| 			} else if (data[i] > rhs.data[i]) { | ||||
| 				return false; | ||||
| 			} | ||||
| 		} | ||||
| 		return true; | ||||
| 		return false; // equal | ||||
| 	} | ||||
|  | ||||
| 	bool operator==(const _PeerID& rhs) const { | ||||
| @@ -128,6 +127,12 @@ struct NGC_HS1 { | ||||
| 			new_msg.msg_id = msg_id; | ||||
| 			new_msg.type = type; | ||||
| 			new_msg.text = text; | ||||
|  | ||||
| 			fprintf(stderr, "######## last msgs ########\n"); | ||||
| 			auto rit = order.crbegin(); | ||||
| 			for (size_t i = 0; i < 10 && rit != order.crend(); i++, rit++) { | ||||
| 				fprintf(stderr, "  %08X - %s\n", *rit, dict.at(*rit).text.c_str()); | ||||
| 			} | ||||
| 		} | ||||
| 	}; | ||||
|  | ||||
| @@ -173,7 +178,7 @@ static void _iterate_group(Tox *tox, NGC_HS1* ngc_hs1_ctx, uint32_t group_number | ||||
| 		for (auto& [key, peer] : group.peers) { | ||||
| 			//fprintf(stderr, "  p: %X%X%X%X\n", key.data.data()[0], key.data.data()[1], key.data.data()[2], key.data.data()[3]); | ||||
| 			peer.time_since_last_request_sent += time_delta; | ||||
| 			if (peer.time_since_last_request_sent > 5.f) { | ||||
| 			if (peer.time_since_last_request_sent > 15.f) { | ||||
| 				peer.time_since_last_request_sent = 0.f; | ||||
|  | ||||
| 				fprintf(stderr, "requesting ids for %X%X%X%X\n", key.data.data()[0], key.data.data()[1], key.data.data()[2], key.data.data()[3]); | ||||
| @@ -210,7 +215,7 @@ void NGC_HS1_iterate(Tox *tox, NGC_HS1* ngc_hs1_ctx/*, void *user_data*/) { | ||||
| 		if (tox_group_is_connected(tox, g_i, &g_err)) { | ||||
| 			// valid and connected here | ||||
| 			// TODO: delta time, or other timers | ||||
| 			_iterate_group(tox, ngc_hs1_ctx, g_i, 0.2f); | ||||
| 			_iterate_group(tox, ngc_hs1_ctx, g_i, 0.02f); | ||||
| 			g_c_done++; | ||||
| 		} else if (g_err != TOX_ERR_GROUP_IS_CONNECTED_GROUP_NOT_FOUND) { | ||||
| 			g_c_done++; | ||||
| @@ -346,6 +351,17 @@ static void _handle_HS_REQUEST_LAST_IDS( | ||||
| 	size_t length | ||||
| ); | ||||
|  | ||||
| static void _handle_HS_RESPONSE_LAST_IDS( | ||||
| 	Tox* tox, | ||||
| 	NGC_HS1* ngc_hs1_ctx, | ||||
|  | ||||
| 	uint32_t group_number, | ||||
| 	uint32_t peer_number, | ||||
|  | ||||
| 	const uint8_t *data, | ||||
| 	size_t length | ||||
| ); | ||||
|  | ||||
| #define _HS1_HAVE(x, error) if ((length - curser) < (x)) { error; } | ||||
| void NGC_HS1_handle_group_custom_packet( | ||||
| 	Tox* tox, | ||||
| @@ -374,6 +390,7 @@ void NGC_HS1_handle_group_custom_packet( | ||||
| 			_handle_HS_REQUEST_LAST_IDS(tox, ngc_hs1_ctx, group_number, peer_number, data+curser, length-curser); | ||||
| 			break; | ||||
| 		case HS_RESPONSE_LAST_IDS: | ||||
| 			_handle_HS_RESPONSE_LAST_IDS(tox, ngc_hs1_ctx, group_number, peer_number, data+curser, length-curser); | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| @@ -401,6 +418,75 @@ static void _handle_HS_REQUEST_LAST_IDS( | ||||
| 	uint8_t last_msg_id_count = data[curser++]; | ||||
|  | ||||
| 	fprintf(stderr, "got request for last %u ids\n", last_msg_id_count); | ||||
|  | ||||
| 	// get group id | ||||
| 	_GroupID g_id{}; | ||||
| 	{ // TODO: error | ||||
| 		tox_group_get_chat_id(tox, group_number, g_id.data.data(), nullptr); | ||||
| 	} | ||||
|  | ||||
| 	auto& group = ngc_hs1_ctx->history[g_id]; | ||||
|  | ||||
| 	std::vector<uint32_t> message_ids{}; | ||||
|  | ||||
| 	if (!group.peers.empty() && group.peers.count(p_key)) { | ||||
| 		const auto& peer = group.peers.at(p_key); | ||||
| 		auto rit = peer.order.crbegin(); | ||||
| 		for (size_t c = 0; c < last_msg_id_count && rit != peer.order.crend(); c++, rit++) { | ||||
| 			message_ids.push_back(*rit); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// - 1 byte packet id | ||||
| 	// respond to a request with 0 or more message ids, sorted by newest first | ||||
| 	// - peer_key bytes (the msg_ids are from) | ||||
| 	// - 1 byte (uint8_t count ids, can be 0) | ||||
| 	// - array [ | ||||
| 	//   - msg_id bytes (the message id | ||||
| 	// - ] | ||||
| 	//std::array<uint8_t, 1+TOX_GROUP_PEER_PUBLIC_KEY_SIZE+1+> pkg; | ||||
| 	std::vector<uint8_t> pkg; | ||||
| 	pkg.resize(1+TOX_GROUP_PEER_PUBLIC_KEY_SIZE+1+sizeof(uint32_t)*message_ids.size()); | ||||
|  | ||||
| 	pkg[0] = HS_RESPONSE_LAST_IDS; | ||||
|  | ||||
| 	std::copy(p_key.data.begin(), p_key.data.end(), pkg.begin()+1); | ||||
|  | ||||
| 	pkg[1+TOX_GROUP_PEER_PUBLIC_KEY_SIZE] = message_ids.size(); | ||||
|  | ||||
| 	for (size_t i = 0; i < message_ids.size(); i++) { | ||||
| 		uint8_t* tmp_ptr = reinterpret_cast<uint8_t*>(message_ids.data()+i); | ||||
| 		// HACK: little endian | ||||
| 		std::copy(tmp_ptr, tmp_ptr+sizeof(uint32_t), pkg.begin()+1+TOX_GROUP_PEER_PUBLIC_KEY_SIZE+1+i*sizeof(uint32_t)); | ||||
| 	} | ||||
|  | ||||
| 	tox_group_send_custom_private_packet(tox, group_number, peer_number, true, pkg.data(), pkg.size(), nullptr); | ||||
| } | ||||
|  | ||||
| static void _handle_HS_RESPONSE_LAST_IDS( | ||||
| 	Tox* tox, | ||||
| 	NGC_HS1* ngc_hs1_ctx, | ||||
|  | ||||
| 	uint32_t group_number, | ||||
| 	uint32_t peer_number, | ||||
|  | ||||
| 	const uint8_t *data, | ||||
| 	size_t length | ||||
| ) { | ||||
| 	size_t curser = 0; | ||||
|  | ||||
| 	_PeerID p_key; | ||||
| 	_HS1_HAVE(p_key.data.size(), fprintf(stderr, "packet too small, missing pkey\n"); return) | ||||
| 	 | ||||
| 	std::copy(data+curser, data+curser+p_key.data.size(), p_key.data.begin()); | ||||
| 	curser += p_key.data.size(); | ||||
|  | ||||
| 	// TODO: did we ask? | ||||
|  | ||||
| 	_HS1_HAVE(1, fprintf(stderr, "packet too small, missing count\n"); return) | ||||
| 	uint8_t last_msg_id_count = data[curser++]; | ||||
|  | ||||
| 	fprintf(stderr, "got response with last %u ids\n", last_msg_id_count); | ||||
| } | ||||
|  | ||||
| #undef _HS1_HAVE | ||||
|   | ||||
		Reference in New Issue
	
	Block a user