-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathchat.d
111 lines (102 loc) · 3.86 KB
/
chat.d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import std.stdio;
import qte5; // Графическая библиотека QtE5
import core.runtime; // Обработка входных параметров
import asc1251;
import std.socket;
import std.getopt; // Раазбор аргументов коммандной строки
string helps() {
return toCON(
"Использование консоли для forthD:
--------------------------------
Запуск:
console5_forthd [-d, -e, -i] ...
");
}
extern (C) {
// void* onChar(CChat* uk, void* ev) {}
void onReturn(CChat* uk) { (*uk).runReturn(); }
void onRes(CChat* uk) { (*uk).runRes(); }
}
// __________________________________________________________________
class CChat : QWidget {
QVBoxLayout vblAll; // Общий вертикальный выравниватель
QPlainTextEdit teLog; // Окно чата
QLineEdit leMes; // Строка сообщения
QAction acSend; // Действие послать ...
QAction acRes; // Действие принять ...
QTimer timer; // Таймер
string nUser;
char[1024] buf;
bool triger;
UdpSocket udp2;
InternetAddress adrRes;
QLCDNumber lcd;
// ______________________________________________________________
this(string user) {
super(this);
resize(300, 400);
nUser = (user == "") ? "unknow ..." : user; setWindowTitle(nUser);
acSend = new QAction(this, &onReturn, aThis);
acRes = new QAction(this, &onRes, aThis);
lcd = new QLCDNumber(this);
udp2 = new UdpSocket();
adrRes = new InternetAddress("0.0.0.0", 11719);
udp2.setOption(SocketOptionLevel.SOCKET, SocketOption.REUSEADDR, true);
udp2.bind(adrRes);
udp2.blocking(false);
timer = new QTimer(this); timer.setSingleShot(false);
connects(timer, "timeout()", acRes, "Slot()");
vblAll = new QVBoxLayout(this); // Главный выравниватель
teLog = new QPlainTextEdit(this);
leMes = new QLineEdit(this);
vblAll.addWidget(teLog).addWidget(leMes).addWidget(lcd);
setLayout(vblAll);
leMes.setFocus();
// Свяжем событие CR в строке сообщения с слотом runReturn()
connects(leMes,"returnPressed()", acSend, "Slot()");
timer.start(100);
}
~this() {
}
// ______________________________________________________________
void runRes() {
auto z = udp2.receiveFrom(buf);
if(z > 0) {
teLog.appendPlainText(buf[0..z]);
}
// writefln("%s\n", buf[0..z]);
// write(z, " "); stdout.flush(); // Отладка
}
// ______________________________________________________________
void runReturn() {
string str = nUser ~ ": "~ leMes.text!string();
if(str == "") return;
auto adrSend = new InternetAddress("255.255.255.255", 11719);
auto udpSend = new UdpSocket();
udpSend.setOption(SocketOptionLevel.SOCKET, SocketOption.BROADCAST, true);
auto ss = udpSend.sendTo(str, adrSend);
udpSend.close();
leMes.clear();
}
}
int main(string[] args) {
bool fDebug = true;
string nameUser;
// Разбор аргументов коммандной строки
try {
auto helpInformation = getopt(args, std.getopt.config.caseInsensitive,
"u|user", toCON("имя пользователя"), &nameUser,
"d|debug", toCON("включить диагностику QtE5"), &fDebug);
if (helpInformation.helpWanted) defaultGetoptPrinter(helps(), helpInformation.options);
} catch {
writeln(toCON("Ошибка разбора аргументов командной стоки ...")); return 1;
}
if (1 == LoadQt(dll.QtE5Widgets, fDebug)) return 1;
QApplication app = new QApplication(&Runtime.cArgs.argc, Runtime.cArgs.argv, 1);
// ---- код программы
CChat wChat = new CChat(nameUser); wChat.saveThis(&wChat);
wChat.show();
// ---- конец кода программы
app.exec();
return 0;
}