ddbot.js-0374 3.2.7 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md DELETED
@@ -1,167 +0,0 @@
1
- Смотрите за руками
2
-
3
- Создатель такой никто под именем 0374flop
4
-
5
- Скажу прямо.
6
- Коментари с нецензурной лексикой и тут и в коде только потому что я за то чтобы цензура стала слабее. Мне не нравиться что везде слишком сильная цензура.
7
- Так что да, не плакайте там.
8
- Простите за орфографические ошибки, писал на скорую руку. (за другие ошибки простите тоже)
9
-
10
-
11
- Ето модуль для роботы с ДДНет (DDNet/teeworlds) ботами. Внутри изпользует чистую библиотеку teeworlds (https://www.npmjs.com/package/teeworlds, https://www.npmjs.com/~swarfey) и просто делает рутинные вещи за вас. Например, может работать с кучей ботов на разных серверах, делает чат не повторяющимся без спамов. Убирает системные сообщения из чата. Можно получить весь список игроков одним методом.
12
-
13
- Вообще я делал его для себя, и по приколу. Но решил выложить чтобы проще работать с зависимостями и не качать с гита.
14
-
15
- Лицензия находиться в файле "LICENSE" там большими буквами для идиотов написано ( MIT )
16
-
17
- У нас есть много всякого, например:
18
- 1. bot.js
19
- Начнем с него.
20
- Ето класс, с методами для работы с большим количеством ботов.
21
- Работает с дебагером.
22
- Емитит кастомные емиты
23
- и там всякое которое мне лень разказывать
24
- 2. index'ы.js
25
- просто вещи чтобы проще было.
26
- что про них сказать?
27
- подключают из других файлов все, и выгружают все в один объект.
28
-
29
- ## Установка.
30
- Так как я только что первый раз зделал нпм пакет то теперь его можно поставить как пакет
31
- Вот так `npm i ddbot.js-0374`
32
- Делаем require('ddbot.js-0374')
33
- И все после етого вам доступно все ето : { bot, botClassAndLoger }.
34
- Наслаждайтесь етом дерьмом.
35
-
36
- ## Техническая документация.
37
- ### bot/BotManager
38
- Окей...
39
- Сейчас я вам разкажу как работает bot/BotManager.
40
-
41
- teeworlds
42
- #### Методы
43
- У нас есть :
44
- 1. bot.createBot()
45
- 1. fulladdress - Полный адрес сервера (IP:порт)
46
- 2. botName - Имя бота
47
- 3. parameter - Параметры бота
48
- 1. identity со скином и другими косметическими деталями.
49
- 2. reconnect переподключаеться бот или нет
50
- 3. reconnectAttempts количество возможных реконектов (-1 для безконечного)
51
- 4. randreconnect будет ли бот переключаться с чуть разной задержкой или нет (в районе 0 - 1 сек)
52
- - На выходе у нас имя бота по которому можно обращаться. (Уникальное имя бота или null в случае ошибки)
53
- 2. bot.connectBot()
54
- 1. Принимает уникальное имя бота и подключает нужного.
55
- - На выхоте булевое значение (нет точных данных подключился ли бот или нет)
56
- 3. bot.disconnectBot()
57
- 1. Принимает уникальное имя бота и отключает нужного.
58
- - Работает также как и connectBot().
59
- 4. bot.disconnectAllBots()
60
- Отключает всех ботов, не принимает аргументов.
61
- Под капотом disconnectBot().
62
- 5. bot.getBotInfo()
63
- 1. Принимает уникальное имя бота и возвращает информацию про него.
64
- - Информация о боте или null, если бот не найден
65
- 6. bot.isBotConnected()
66
- 1. Принимает уникальное имя бота.
67
- - Возвращает булевое значение.
68
- 7. bot.isFreezeBot()
69
- 1. Принимает уникальное имя бота.
70
- - Возвращает булевое значение.
71
- 8. bot.setFreezeBot()
72
- Просто меняет значение того заморожен ли бот. (не влияет на игру)
73
- 9. bot.getAllActiveBots()
74
- Получение всех активных ботов
75
- - Массив имен всех активных ботов
76
- 10. bot.getBotClient()
77
- 1. Принимает уникальное имя бота.
78
- - Возвращает клиент teeworlds
79
- 11. bot.removeBot()
80
- Удаляет бота полностью. (и отключает)
81
- 1. Принимает уникальное имя бота.
82
- - Возвращает булевое значение.
83
- 12. bot.getBot()
84
- 1. Принимает уникальное имя бота.
85
- - Возвращает прокси-объект бота.
86
- 13. bot._setupBotEvents()
87
- Заставляет ивенты работать. Изпользуеться в bot.createBot() чтобы вы могли делать все проще и вам не нужно было получать оригинальный клиент teeworlds для ивентов.
88
- 1. Принимает уникальное имя бота.
89
- 2. Принимает клиент teeworlds
90
- Ничего не возвращает.
91
- 14. bot.getPlayerList()
92
- 1. Принимает уникальное имя бота.
93
- - Array список игроков.
94
- 15. bot.getPlayerName()
95
- 1. Принимает уникальное имя бота/Array список игроков.
96
- 2. clientid нужного игрока.
97
- - Имя нужного игрока.
98
-
99
- #### пример ехо бота
100
- ```js
101
- // Пример писался под комит c453b96f9fd717375f5ff70525603b7e1491c290.
102
-
103
- const DebugLogger = require('loger0374'); // мой логер (не обязательно изпользовать)
104
- const { bot, botClassAndLoger } = require('../../index');
105
- const botdebug = botClassAndLoger.logDebuger;
106
- botdebug.setDebugMode(true, true, true);
107
-
108
- const logDebuger = new DebugLogger('example', true, true, null, true);
109
-
110
- async function main() {
111
- logDebuger.logDebug('Main started');
112
-
113
- const identitybot = {
114
- name: "Towa",
115
- clan: "Towa Team",
116
- skin: "Astolfofinho",
117
- use_custom_color: 1,
118
- color_body: 16711680,
119
- color_feet: 16711680,
120
- country: 804
121
- };
122
-
123
- const botName = await bot.createBot('45.141.57.22:8311', 'Towa', {
124
- identity: identitybot,
125
- reconnect: true,
126
- reconnectAttempts: -1,
127
- randreconnect: true
128
- });
129
-
130
- bot.connectBot(botName); // подкюлчаем
131
-
132
- const botClient = bot.getBotClient(botName); // получаем оригинальный клиент teeworlds
133
-
134
- // Подписка на событие подключения
135
- bot.on(`${botName}:connect`, () => {
136
- let timemsg = 0; // время
137
-
138
- setTimeout(() => {
139
- botClient.game.Say('Ку всем');
140
- }, 1251);
141
-
142
- // подписка на чат
143
- bot.on(`${botName}:ChatNoSystem`, (msgraw, autormsg, text, team, client_id) => {
144
- logDebuger.logDebug(`${client_id} ${team} '${autormsg}' : ${text}`); // вывод чата в консоль
145
- if (text == 'exit') exit(); // выход
146
-
147
- // Эхо-логика
148
- if (Date.now() - timemsg > 6000) {
149
- timemsg = Date.now(); // устанавливаем текущее время
150
- if (text && autormsg) {
151
- botClient.game.Say(`${autormsg}: ${text}`); // отправка сообения (teeworlds)
152
- }
153
- }
154
- });
155
- });
156
-
157
- // Выход через Ctrl+C
158
- async function exit() {
159
- logDebuger.logDebug('Shutting down...');
160
- await bot.disconnectAllBots(); // отключаем всех ботов
161
- process.exit(0); // завершаем процес
162
- }
163
- process.on('SIGINT', exit); // Ctrl+C
164
- }
165
-
166
- if (require.main === module) main();
167
- ```
@@ -1,200 +0,0 @@
1
- declare module 'ddbot.js-0374' {
2
- import { EventEmitter } from 'events';
3
-
4
- /**
5
- * Информация об идентичности бота (скин, клан, цвета и т.д.)
6
- */
7
- export interface BotIdentity {
8
- name?: string;
9
- clan?: string;
10
- skin?: string;
11
- use_custom_color?: number;
12
- color_body?: number;
13
- color_feet?: number;
14
- country?: number;
15
- }
16
-
17
- /**
18
- * Параметры для создания бота
19
- */
20
- export interface BotParameters {
21
- /** Идентичность бота (скин, клан, цвета) */
22
- identity?: BotIdentity;
23
- /** Переподключаться ли боту при разрыве соединения */
24
- reconnect?: boolean;
25
- /** Количество попыток переподключения (-1 для бесконечного) */
26
- reconnectAttempts?: number;
27
- /** Использовать ли случайную задержку при переподключении (0-1 сек) */
28
- randreconnect?: boolean;
29
- }
30
-
31
- /**
32
- * Информация о боте
33
- */
34
- export interface BotInfo {
35
- client: any;
36
- fulladdress: string;
37
- originalName: string;
38
- parameter: BotParameters;
39
- isConnected: boolean;
40
- createdAt: number;
41
- }
42
-
43
- /**
44
- * Информация об игроке на сервере
45
- */
46
- export interface PlayerInfo {
47
- client_id: number;
48
- name: string;
49
- clan: string;
50
- country: number;
51
- team: number;
52
- skin: string;
53
- x: number | null;
54
- y: number | null;
55
- }
56
-
57
- /**
58
- * Детали карты
59
- */
60
- export interface MapDetails {
61
- map_name: string;
62
- map_url?: string;
63
- }
64
-
65
- /**
66
- * Менеджер ботов для управления несколькими ботами
67
- */
68
- export class BotManager extends EventEmitter {
69
- /**
70
- * Создает нового бота
71
- * @param fulladdress - Полный адрес сервера (IP:порт)
72
- * @param botName - Имя бота
73
- * @param parameter - Параметры бота
74
- * @returns Уникальное имя бота или null в случае ошибки
75
- */
76
- createBot(
77
- fulladdress: string,
78
- botName: string,
79
- parameter?: BotParameters
80
- ): Promise<string | null>;
81
-
82
- /**
83
- * Подключает бота к серверу
84
- * @param botName - Уникальное имя бота
85
- * @returns true если подключение успешно
86
- */
87
- connectBot(botName: string): Promise<boolean>;
88
-
89
- /**
90
- * Отключает бота от сервера
91
- * @param botName - Уникальное имя бота
92
- * @returns true если отключение успешно
93
- */
94
- disconnectBot(botName: string): Promise<boolean>;
95
-
96
- /**
97
- * Отключает всех ботов
98
- * @returns Результаты отключения каждого бота
99
- */
100
- disconnectAllBots(): Promise<Array<PromiseSettledResult<boolean>>>;
101
-
102
- /**
103
- * Получает информацию о боте
104
- * @param botName - Уникальное имя бота
105
- * @returns Информация о боте или null
106
- */
107
- getBotInfo(botName: string): BotInfo | null;
108
-
109
- /**
110
- * Проверяет, подключен ли бот
111
- * @param botName - Уникальное имя бота
112
- * @returns true если бот подключен
113
- */
114
- isBotConnected(botName: string): boolean;
115
-
116
- /**
117
- * Проверяет, заморожен ли бот
118
- * @param botName - Уникальное имя бота
119
- * @returns true если бот заморожен
120
- */
121
- isFreezeBot(botName: string): boolean;
122
-
123
- /**
124
- * Устанавливает состояние заморозки бота
125
- * @param botName - Уникальное имя бота
126
- * @param isFrozen - true для заморозки, false для разморозки
127
- */
128
- setFreezeBot(botName: string, isFrozen: boolean): void;
129
-
130
- /**
131
- * Получает список всех активных ботов
132
- * @returns Массив имен всех активных ботов
133
- */
134
- getAllActiveBots(): string[];
135
-
136
- /**
137
- * Получает клиент бота
138
- * @param botName - Уникальное имя бота
139
- * @returns Клиент бота или null
140
- */
141
- getBotClient(botName: string): any | null;
142
-
143
- /**
144
- * Удаляет бота из менеджера
145
- * @param botName - Уникальное имя бота
146
- * @returns true если бот был удален
147
- */
148
- removeBot(botName: string): boolean;
149
-
150
- /**
151
- * Получает объект бота с событиями
152
- * @param botName - Уникальное имя бота
153
- * @returns Объект бота или null
154
- */
155
- getBot(botName: string): any | null;
156
-
157
- /**
158
- * Получает список игроков на сервере
159
- * @param botName - Уникальное имя бота
160
- * @returns Массив игроков
161
- */
162
- getPlayerList(botName: string): PlayerInfo[];
163
-
164
- /**
165
- * Получает имя игрока по его ID
166
- * @param botName - Уникальное имя бота или массив игроков
167
- * @param clientId - ID клиента игрока
168
- * @returns Имя игрока или null
169
- */
170
- getPlayerName(botName: string | PlayerInfo[], clientId: number): string | null;
171
-
172
- // События
173
- on(event: `${string}:connect`, listener: () => void): this;
174
- on(event: `${string}:connected`, listener: () => void): this;
175
- on(event: `${string}:disconnect`, listener: (reason: string, reconnectTime?: number) => void): this;
176
- on(event: `${string}:disconnected`, listener: (reason: string, reconnectTime?: number) => void): this;
177
- on(event: `${string}:reconnect`, listener: (reconnectTime: number) => void): this;
178
- on(event: `${string}:snapshot`, listener: (snapshot: any) => void): this;
179
- on(event: `${string}:message`, listener: (msg: object) => void): this;
180
- on(event: `${string}:ChatNoSystem`, listener: (msgraw: object, autormsg: string, text: string, team: number, client_id: number) => void): this;
181
- on(event: `${string}:ChatRaw`, listener: (msgraw: object, autormsg: string, text: string, team: number, client_id: number) => void): this;
182
- on(event: `${string}:error`, listener: (error: Error) => void): this;
183
- on(event: `${string}:map_details`, listener: (mapDetails: MapDetails) => void): this;
184
- on(event: string, listener: (...args: any[]) => void): this;
185
- }
186
-
187
- /**
188
- * Объект с классом BotManager и логгером из модуля Loger0374
189
- */
190
- export interface BotClassAndLogger {
191
- BotManager: typeof BotManager;
192
- logDebuger: any;
193
- }
194
-
195
- /** Экземпляр BotManager */
196
- export const bot: BotManager;
197
-
198
- /** Класс BotManager и логгер */
199
- export const botClassAndLoger: BotClassAndLogger;
200
- }
@@ -1,87 +0,0 @@
1
- // Пример писался под комит c453b96f9fd717375f5ff70525603b7e1491c290.
2
-
3
- const DebugLogger = require('loger0374'); // Подключаем логгер
4
- const { bot, botClassAndLoger } = require('../../index'); // Подключаем бота (если подключаете с пакета, то ddbot.js-0374)
5
- const botdebug = botClassAndLoger.logDebuger;
6
- botdebug.setDebugMode(true, true, true);
7
-
8
- const readline = require('readline');
9
-
10
- // Создаем интерфейс для ввода с консоли
11
- const rl = readline.createInterface({
12
- input: process.stdin,
13
- output: process.stdout,
14
- prompt: '> '
15
- });
16
-
17
- function clearLastLine() {
18
- process.stdout.moveCursor(0, -1); // поднимаемся на одну строку вверх
19
- process.stdout.clearLine(0); // очищаем всю строку
20
- process.stdout.cursorTo(0); // возвращаем курсор в начало строки
21
- }
22
-
23
- const logDebuger = new DebugLogger('example', true, true, null, true);
24
-
25
- async function main() {
26
- logDebuger.logDebug('Main started');
27
-
28
- const identitybot = {
29
- name: "Towa",
30
- clan: "Towa Team",
31
- skin: "Astolfofinho",
32
- use_custom_color: 1,
33
- color_body: 16711680,
34
- color_feet: 16711680,
35
- country: 804
36
- };
37
-
38
- const botName = await bot.createBot('45.141.57.22:8365', 'Towa', {
39
- identity: identitybot,
40
- reconnect: true,
41
- reconnectAttempts: -1,
42
- randreconnect: true
43
- });
44
-
45
- bot.connectBot(botName); // подкюлчаем
46
-
47
- const botClient = bot.getBotClient(botName); // получаем оригинальный клиент teeworlds
48
-
49
- // Подписка на событие подключения
50
- bot.on(`${botName}:connect`, () => {
51
- let timemsg = 0; // время
52
-
53
- rl.on('line', (input) => {
54
- const message = input.trim();
55
-
56
- if (message === 'exit') {
57
- exit();
58
- return;
59
- }
60
-
61
- if (message) {
62
- botClient.game.Say(message);
63
- }
64
-
65
- rl.prompt(); // Показываем prompt снова
66
- });
67
-
68
- // подписка на чат
69
- bot.on(`${botName}:ChatNoSystem`, (msgraw, autormsg, text, team, client_id) => {
70
- logDebuger.logDebug(`${client_id} ${team} '${autormsg}' : ${text}`); // вывод чата в консоль
71
- clearLastLine(); // очищаем последнюю строку ввода
72
- logDebuger.logDebug(`${client_id} ${team} '${autormsg}' : ${text}`); // повторно выводим сообщение
73
- if (text == 'exit') exit(); // выход
74
- rl.prompt();
75
- });
76
- });
77
-
78
- // Выход через Ctrl+C
79
- async function exit() {
80
- logDebuger.logDebug('Shutting down...');
81
- await bot.disconnectAllBots(); // отключаем всех ботов
82
- process.exit(0); // завершаем процес
83
- }
84
- process.on('SIGINT', exit); // Ctrl+C
85
- }
86
-
87
- if (require.main === module) main();
@@ -1,66 +0,0 @@
1
- // Пример писался под комит c453b96f9fd717375f5ff70525603b7e1491c290.
2
-
3
- const DebugLogger = require('loger0374');
4
- const { bot, botClassAndLoger } = require('../../index');
5
- const botdebug = botClassAndLoger.logDebuger;
6
- botdebug.setDebugMode(true, true, true);
7
-
8
- const logDebuger = new DebugLogger('example', true, true, null, true);
9
-
10
- async function main() {
11
- logDebuger.logDebug('Main started');
12
-
13
- const identitybot = {
14
- name: "Towa",
15
- clan: "Towa Team",
16
- skin: "Astolfofinho",
17
- use_custom_color: 1,
18
- color_body: 16711680,
19
- color_feet: 16711680,
20
- country: 804
21
- };
22
-
23
- const botName = await bot.createBot('45.141.57.22:8311', 'Towa', {
24
- identity: identitybot,
25
- reconnect: true,
26
- reconnectAttempts: -1,
27
- randreconnect: true
28
- });
29
-
30
- bot.connectBot(botName); // подкюлчаем
31
-
32
- const botClient = bot.getBotClient(botName); // получаем оригинальный клиент teeworlds
33
-
34
- // Подписка на событие подключения
35
- bot.on(`${botName}:connect`, () => {
36
- let timemsg = 0; // время
37
-
38
- setTimeout(() => {
39
- botClient.game.Say('Ку всем');
40
- }, 1251);
41
-
42
- // подписка на чат
43
- bot.on(`${botName}:ChatNoSystem`, (msgraw, autormsg, text, team, client_id) => {
44
- logDebuger.logDebug(`${client_id} ${team} '${autormsg}' : ${text}`); // вывод чата в консоль
45
- if (text == 'exit') exit(); // выход
46
-
47
- // Эхо-логика
48
- if (Date.now() - timemsg > 6000) {
49
- timemsg = Date.now(); // устанавливаем текущее время
50
- if (text && autormsg) {
51
- botClient.game.Say(`${autormsg}: ${text}`); // отправка сообения (teeworlds)
52
- }
53
- }
54
- });
55
- });
56
-
57
- // Выход через Ctrl+C
58
- async function exit() {
59
- logDebuger.logDebug('Shutting down...');
60
- await bot.disconnectAllBots(); // отключаем всех ботов
61
- process.exit(0); // завершаем процес
62
- }
63
- process.on('SIGINT', exit); // Ctrl+C
64
- }
65
-
66
- if (require.main === module) main();
@@ -1,140 +0,0 @@
1
- const { bot, botClassAndLoger } = require('../../index');
2
- botClassAndLoger.logDebuger.setDebugMode(true, true);
3
-
4
- async function main() {
5
- console.log('Main started');
6
-
7
- const identitybot = {
8
- name: "Towa",
9
- clan: "Towa Team",
10
- skin: "Astolfofinho",
11
- use_custom_color: 1,
12
- color_body: 16711680,
13
- color_feet: 16711680,
14
- country: -1
15
- };
16
-
17
- const botName = await bot.createBot('45.141.57.22:8375', 'Towa', {
18
- identity: identitybot,
19
- reconnect: true,
20
- reconnectAttempts: -1
21
- });
22
-
23
- bot.connectBot(botName);
24
-
25
- const botClient = bot.getBotClient(botName);
26
-
27
- bot.on(`${botName}:connect`, () => {
28
- function startemote(botClient, Emotenumber) {
29
- const intervalemote = setInterval(() => {
30
- botClient.game.Emote(Emotenumber);
31
- }, 5000);
32
- return intervalemote;
33
- }
34
-
35
- function startnameset(botClient, bot, identitybot) {
36
- const intervalnameset = setInterval(() => {
37
- const myclientid = botClient.SnapshotUnpacker.OwnID;
38
- const me = bot.getPlayerList(botName).find(p => p.client_id === myclientid);
39
-
40
- if (!me) return;
41
-
42
- if (me.name !== identitybot.name) {
43
- botClient.game.ChangePlayerInfo({ ...identitybot, name: identitybot.name });
44
- }
45
- }, 10000);
46
- return intervalnameset;
47
- }
48
-
49
- let sync = false;
50
- let intervalemote = startemote(botClient, 2);
51
- let intervalnameset = startnameset(botClient, bot, identitybot);
52
-
53
- async function startchatlistener(bot, botName) {
54
- bot.on(`${botName}:ChatNoSystem`, (msg, autormsg, text, team, client_id) => {
55
- console.log(`${client_id} ${team} '${autormsg}' : ${text}`);
56
-
57
- if (text.includes(identitybot.name) && text.includes('%syncE')) {
58
- sync = true;
59
- if (intervalemote) clearInterval(intervalemote);
60
- intervalemote = startemote(botClient, 2);
61
- }
62
- });
63
- }
64
-
65
- startchatlistener(bot, botName);
66
-
67
- bot.on(`${botName}:disconnect`, (reason) => {
68
- clearInterval(intervalemote);
69
- clearInterval(intervalMove);
70
- clearInterval(intervalnameset);
71
- if (reason !== null) console.log(reason);
72
- });
73
-
74
- function findbot2(botName, identitybot) {
75
- const players = bot.getPlayerList(botName);
76
-
77
- return players.some(player =>
78
- player.clan === identitybot.clan &&
79
- player.skin === identitybot.skin &&
80
- player.name.includes(identitybot.name) &&
81
- player.name !== identitybot.name
82
- );
83
- }
84
-
85
- setInterval(() => {
86
- if (findbot2(botName, identitybot) && !sync) {
87
- botClient.game.Say(botName+'%syncE');
88
- } if (!findbot2(botName, identitybot)) {
89
- sync = false;
90
- }
91
- }, 60000);
92
- });
93
-
94
- let x = 100;
95
- let direction = -1;
96
- const intervalMove = setInterval(() => {
97
- x += direction * 10;
98
- if (x <= -100) {
99
- direction = 1;
100
- } else if (x >= 100) {
101
- direction = -1;
102
- }
103
- if (bot.isBotConnected(botName) && bot.isFreezeBot(botName)) {
104
- if (botClient && botClient.movement) {
105
- botClient.movement.FlagHookline(true);
106
- setTimeout(() => {
107
- botClient.movement.FlagHookline(false);
108
- }, Math.random() * 50);
109
- botClient.movement.SetAim(x, -100);
110
- }
111
- }
112
- }, Math.random() * 100);
113
-
114
- async function SayChat(message) {
115
- botClient.game.Say(message);
116
- }
117
-
118
- async function exit() {
119
- console.log('Shutting down...');
120
- console.log('disconnecting...');
121
- await bot.disconnectAllBots();
122
- console.log('Main stopped');
123
- process.exit(0);
124
- }
125
-
126
- process.on('SIGINT', () => {
127
- exit();
128
- });
129
-
130
- module.exports.exit = exit;
131
- module.exports.SayChat = SayChat;
132
- }
133
-
134
- if (require.main === module) main();
135
-
136
- module.exports.main = main;
137
-
138
- // можете щитать ето примером, ето просто как тест
139
- // тут нет коментариев но если хотите то сами поймите как работает
140
- // если что то не понятно то спрашивайте ИИ может поможет, надеюсь...