Skip to content

Commit 0a100e5

Browse files
authored
Plná podpora Unicode, vyčištění kódu
Odstraněn locale a codepage (a možnosti je změnit), změna všech stringů a vektorů na wchar_t, přidány komentáře pro přehlednost
1 parent 02f2a36 commit 0a100e5

File tree

2 files changed

+85
-79
lines changed

2 files changed

+85
-79
lines changed

lyoUtil.h

+17-8
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
#include <locale>
77
#include <limits>
88
#include <Windows.h>
9+
#include <fcntl.h>
910
#include <time.h>
11+
#include <io.h>
1012

1113
using namespace std;
1214

@@ -72,19 +74,23 @@ void sendText() {
7274
Sleep(delay);
7375
}
7476

75-
void flushCin() {
77+
// Použijte pøed getline, pokud ho nìkdy pøecházel wcin.
78+
79+
void FlushCinW() {
7680

77-
cin.clear();
78-
cin.ignore(numeric_limits<streamsize>::max(), '\n');
81+
wcin.clear();
82+
wcin.ignore(numeric_limits<streamsize>::max(), '\n');
7983
}
8084

81-
void setColor(WORD msgColor) {
85+
// Usnadní práci jen trochu, ale i tak je užiteèná.
86+
87+
void SetColor(WORD msgColor) {
8288

8389
SetConsoleTextAttribute(hConsole, msgColor); // Jen v cmd prostøedí!
8490
}
8591

8692

87-
void printColoredMsg(bool isRainbow, int clrBase, string msg, WORD nextColor) {
93+
void PrintColoredMsg(bool isRainbow, int clrBase, wstring msg, WORD nextColor) {
8894

8995
// isRainbow - Má to být duhové?
9096
// clrBase - V pøípadì jednobarevného urèuje barvu, v pøípadì duhového urèuje základnu
@@ -99,7 +105,7 @@ void printColoredMsg(bool isRainbow, int clrBase, string msg, WORD nextColor) {
99105
SetConsoleTextAttribute(hConsole, clr);
100106
clr++;
101107

102-
if (clr > clrBase + 5) {
108+
if (clr > clrBase + 6) {
103109

104110
clr = clrBase;
105111
}
@@ -110,13 +116,16 @@ void printColoredMsg(bool isRainbow, int clrBase, string msg, WORD nextColor) {
110116
else {
111117

112118
SetConsoleTextAttribute(hConsole, clrBase);
113-
cout << msg;
119+
wcout << msg;
114120
}
115121
SetConsoleTextAttribute(hConsole, nextColor);
116122
}
117123

124+
// Tato funkce je plnì automatizovaná - vektor mùže mít jakýkoliv
125+
// typ a velikost, a ChooseRandElem to pøijme díky templatu
126+
118127
template<typename T>
119-
T chooseRandElem(vector<T> &arr) {
128+
T ChooseRandElem(vector<T> &arr) {
120129

121130
int randIndex = rand() % arr.size();
122131

spam.cpp

+68-71
Original file line numberDiff line numberDiff line change
@@ -1,125 +1,122 @@
1+
// Jednoduchý C++ spammer. Kvůli využití wmain() musí být všechny I/O operace wide (široké), tzn. string musí být wstring a cin musí být wcin.
2+
// Před každým stringem musí také být prefix L (pro wide string).
3+
// _setmode zajišťuje Unicode podporu, tudíž není nutné nastavovat locale a codepage.
4+
5+
6+
7+
8+
// Windows definice
19
#define NOMINMAX
2-
#define SUCCESS 10
3-
#define FAILURE 12
4-
#define USERINPUT 11
5-
#define WHITE 15
10+
11+
// Konstantní výrazy
12+
constexpr int B_BASE = 9;
13+
constexpr int SUCCESS = 10;
14+
constexpr int FAILURE = 12;
15+
constexpr int USERINPUT = 11;
16+
constexpr int WHITE = 15;
617

718
#include "lyoUtil.h"
819

920
using namespace std;
1021

11-
int main() {
22+
int wmain() {
1223

1324
// Seed pro rand()
1425
srand((unsigned int)time(NULL));
1526

16-
// Proměnné a jejich základní hodnoty
17-
string ans;
18-
UINT codepage = 1250;
19-
string sLocale = "cs_CZ";
27+
// Proměnné a jejich základní hodnoty
28+
wstring ans;
2029
delay = 30;
2130

2231
// Vektory
23-
vector<string> splashText = { "Le fishe au chocolat.", "Napajedla neexistují.", "Praise Gabča.", "30x rychlejší než Python.", "Garance špagetového kódu.", "Schváleno Kuncišem.", "Směřujte spam na lyorig#0775.", "Isn't it?", "Nenávidím tento jazyk.", "Pořád stabilnější než Fallout 76.", "Kvůli tomuto mám dvojku z biologie.", "Spam! není spam."};
24-
vector<string> titleText = { "Audavillage", "Videomath", "paint.com", "Imagine 2", "Paint 4D", "XboxDiagram", "C++Charm", "Kyberdigi.cz", "Craftmine", "Toto !== virus" }; // UTF-8
25-
26-
// Základní nastavení
27-
SetConsoleTitleA(chooseRandElem(titleText).c_str());
28-
setlocale(LC_ALL, "cs_CZ");
29-
SetConsoleCP(1250);
32+
vector<wstring> splashText = { L"Le fishe au chocolat.", L"Napajedla neexistují.", L"Praise Gabča.", L"30x rychlejší než Python.", L"Garance špagetového kódu.", L"Schváleno Kuncišem.", L"Směřujte spam na lyorig#0775.", L"Isn't it?", L"Nenávidím tento jazyk.", L"Pořád stabilnější než Fallout 76.", L"Kvůli tomuto mám dvojku z biologie.", L"Spam! není spam."};
33+
vector<wstring> titleText = { L"Audavillage", L"Videomath", L"paint.com", L"Imagine 2", L"Malování 4D", L"XboxDiagram", L"C++Charm", L"Kyberdigi", L"Craftmine", L"Windows Defender" };
3034

31-
setColor(WHITE);
35+
// Základní nastavení
36+
SetConsoleTitleW(ChooseRandElem(titleText).c_str());
37+
SetColor(WHITE);
38+
39+
(void)_setmode(_fileno(stdout), _O_U16TEXT); // Oba jsou castované na void protože jinak Visual Studio hází
40+
(void)_setmode(_fileno(stdin), _O_U16TEXT); // varování o ignorování vratné hodnoty (kterou stejně nevyužiju)
3241

33-
cout << "(c) Petr Šácha 2022. ";
34-
printColoredMsg(false, USERINPUT, chooseRandElem(splashText), WHITE);
35-
cout << "\nPoužitím či modifikací programu souhlasíte se samostatností Míkovic.\n\n";
36-
printColoredMsg(false, WHITE, "Chcete upravit nastavení? (ano/ne): ", USERINPUT);
37-
cin >> ans;
3842

3943

4044

41-
42-
// Goto je giga cringe ale jsem líný programátor
43-
if (ans == "ano") {
45+
wcout << L"(c) Petr Šácha 2022. ";
4446

45-
Q1A:
46-
printColoredMsg(false, WHITE, "\nProdleva mezi repeticemi (ms): ", USERINPUT);
47-
cin >> delay;
47+
PrintColoredMsg(false, USERINPUT, ChooseRandElem(splashText), WHITE);
4848

49-
if (!cin || delay < 0 || delay > 10000) {
49+
wcout << L"\nPoužitím či modifikací programu souhlasíte se samostatností Míkovic.\n\n";
5050

51-
printColoredMsg(false, FAILURE, "Neplatná prodleva. Zadejte jinou.\n", WHITE);
52-
flushCin();
53-
goto Q1A;
54-
}
51+
PrintColoredMsg(false, WHITE, L"Chcete upravit nastavení? (ano/ne): ", USERINPUT);
52+
53+
wcin >> ans;
5554

5655

5756

58-
Q1B:
59-
printColoredMsg(false, WHITE, "\nProdleva mezi stiskem a odesláním klávesy (ms): ", USERINPUT);
60-
cin >> inbDelay;
57+
58+
// Goto je giga cringe ale jsem líný programátor
6159

62-
if (!cin || inbDelay < 0 || inbDelay > 1000) {
60+
if (ans == L"ano") {
6361

64-
printColoredMsg(false, FAILURE, "Neplatná prodleva. Zadejte jinou.\n", WHITE);
65-
flushCin();
66-
goto Q1B;
67-
}
62+
Q1:
63+
PrintColoredMsg(false, WHITE, L"\nProdleva mezi repeticemi (ms): ", USERINPUT);
64+
wcin >> delay;
6865

66+
if (!wcin || delay < 0 || delay > 10000) {
67+
68+
PrintColoredMsg(false, FAILURE, L"Neplatná prodleva. Zadejte jinou.\n", WHITE);
69+
FlushCinW();
70+
goto Q1;
71+
}
6972

7073

74+
7175
Q2:
72-
printColoredMsg(false, WHITE, "\nCodepage: ", USERINPUT);
73-
cin >> codepage;
76+
PrintColoredMsg(false, WHITE, L"\nProdleva mezi stiskem a odesláním klávesy (ms): ", USERINPUT);
77+
wcin >> inbDelay;
7478

75-
if (!cin || codepage > 1500) {
79+
if (!wcin || inbDelay < 0 || inbDelay > 1000) {
7680

77-
printColoredMsg(false, FAILURE, "Neplatný codepage. Zadejte jiný.\n", WHITE);
78-
flushCin();
81+
PrintColoredMsg(false, FAILURE, L"Neplatná prodleva. Zadejte jinou.\n", WHITE);
82+
FlushCinW();
7983
goto Q2;
8084
}
8185

8286

83-
84-
Q3:
85-
printColoredMsg(false, WHITE, "\nLocale: ", USERINPUT);
86-
cin >> sLocale;
87-
88-
if (!cin || sLocale.length() < 4 || sLocale.length() > 10) { // Locale může být i 10 znaků dlouhý, tak pro jistotu
89-
90-
printColoredMsg(false, FAILURE, "Neplatný locale. Zadejte jiný.\n", WHITE);
91-
flushCin();
92-
goto Q3;
93-
}
94-
95-
printColoredMsg(false, SUCCESS, "\nNastaveno.\n", WHITE); // Lež! Přece to bude nastaveno až o několik řádků později
87+
88+
PrintColoredMsg(false, SUCCESS, L"\nNastaveno.\n", WHITE);
9689
}
9790

9891

9992

100-
else { // Cokoliv jiného než "ano" se bere jako ne
93+
else { // Cokoliv jiného než "ano" se bere jako ne
10194

102-
setColor(SUCCESS);
95+
SetColor(SUCCESS);
10396

104-
cout << "\nProdleva nastavena na doporučenou (" << delay << "ms).\n";
105-
cout << "Prodleva mezi stiskem a odesláním klávesy nastavena na doporučenou (" << inbDelay << "ms).\n";
106-
cout << "Locale nastaven na doporučený (" << sLocale << ").\n";
107-
cout << "Codepage nastaven na doporučený (" << codepage << ").\n"; // Další lži! Tyto jsou alespoň o hodně řádků blíž
97+
wcout << L"\nProdleva nastavena na doporučenou (" << delay << "ms).\n";
98+
wcout << L"Prodleva mezi stiskem a odesláním klávesy nastavena na doporučenou (" << inbDelay << "ms).\n";
10899
}
109100

110-
setlocale(LC_ALL, sLocale.c_str());
111-
SetConsoleCP(codepage);
112101

113-
printColoredMsg(false, WHITE, "\nCo chcete spamovat? -> ", USERINPUT);
102+
103+
PrintColoredMsg(false, WHITE, L"\nCo chcete spamovat? -> ", USERINPUT);
114104

115-
flushCin();
105+
FlushCinW();
116106
getline(wcin, wts);
117107

118-
printColoredMsg(false, SUCCESS, "\nPřipraveno. Držte F12 pro spam.", WHITE);
119-
108+
PrintColoredMsg(false, SUCCESS, L"\nPřipraveno. Držte F12 pro spam.", WHITE);
120109

110+
111+
112+
// DEBUG ZÓNA
113+
121114

122115

116+
// KONEC DEBUG ZÓNY
117+
118+
119+
123120
while(true) {
124121

125122
if (GetKeyState(VK_F12) & 0x8000) {

0 commit comments

Comments
 (0)