Многопользовательский чат на BAT

:

Был период, когда в универе задали сделать несколько чатов. В зависимости от вариантов, были заданы различные способы взаимодействия программ от сокетов до майлслотов (mailslot). Когда задания были прикончены, остались силы взяться за скрипты BAT. Вот что получилось…

Всё что нужно для запуска:
1. Взять код по ссылке в конце статьи
2. Сохранить код в файл *.bat
3. Положить файл в сетевую папку
4. Запустить файл с разных компов (можно и с одного)

В комментариях предложили использовать совместно с DropBox, но говорят — что работает весьма не быстро.

Прежде всего, хочу извиниться за код, оформленный скриншотами. Просто никто не подсветит BAT-ник лучше, чем это делает Notepad++. Снимки кода сохранены в палитровые (256 цветов) PNG — вес скринов кода по 5-10Кб.

Сперва про реализацию


Базовые элементы:
1. %chat% — имя группы
2. %nick% — имя пользователя
3. файл "%chat%_history" — файл с полной историей группы
4. файл "%chat%" — файл с последней репликой в группе
5. файл "%chat%_cs" — файл используемый для синхронизации

Для начала спросим пользователя ввести имя группы и свой ник. После получения имени группы и ника в строке №5 производится запуск скриптом самого себя с тремя параметрами: слово talk_widget, а также имя группы и имя пользователя.

Теперь выводим в заголовке окна название группы и имя пользователя (строка №3). Если существует файл с именем %chat%_history, печатаем его содержимое на экран (строка №4). Далее в цикле считываем содержимое файла %chat% и сравниваем его с тем, что было в предыдущем считывании. Если содержимое файла изменилось — печатаем его на экран.

Изначально код имеет следующую структуру: при запуске проверяются параметры, если первым параметром идёт слово «talk_widget», то скрипт выполняет код, относящийся к отправке текста. При отсутствии такового параметра, код выполняет функцию получения и отображения данных. Изначально производится запуск скрипта без параметров, он спрашивает имя группы и имя пользователя, запускает второй процесс с параметром «talk_widget», а сам начинает печатать содержимое чат-группы.

Теперь о том, как работает код принимающий ввод от пользователя. Он сперва модифицирует заголовок окна (строка №5). Затем печатает в файл последней реплики сообщение-уведомление о своём подключении и дописывает сообщение к истории. При доступе к файлу реплики используется примитивный механизм критических секций (чуть ниже рассмотрим, как он работает). Далее в цикле (строки 11-19) производится получение от пользователя строк данных и их запись в файл реплики и допись в файл истории.

Функция входа в критическую секцию в файл, используемый для синхронизации, циклично записывает случайное число. До тех пор пока оно не окажется там при повторном считывании. Если на момент запуска функции файл существует, также осуществляется небольшая задержка. Задержки реализуются через ping>nul.

Функция выхода из критической секции просто удаляет файл синхронизации.

Теперь про результат


Имеется чат, обладающий следующими качествами:
1. Разделение по чат-группам (много групп и много пользователей)
2. Получение истории общения новыми участниками
3. Общение по сети (выложить скрипт в расшаренную папку и запустить с разных компьютеров)

При запуске, скрипт спрашивает имя чат-группы и имя пользователя.

После ввода требуемых данных, появляется второе окно, служащее консолью для ввода:

Теперь запущу этот же BAT-файл (он лежит в расшаренной папке) с другого компьютера сети.

После ввода того же самого имени чата и имени нового пользователя опять же появится второе окно для ввода данных на отправку.

Теперь попробуем пересылать сообщения между абонентами:

Теперь подключимся с третьего компьютера:

И увидим следующую картину:

Внимание! Замечен непонятный баг в win7 x64 при запуске скрипта из сетевой папки //***. Третья строка скрипта pushd "%~dp0" интерпретируется очень долго. Очень долго разбирается %~dp0, попробуйте просто echo %~dp0 вызвать — это как минимум странно. Если подождать минуты 2-3, то всё будет работать нормально... в WinXP таких проблем нет.

Предупреждение: при каждом запуске скрипта из сетевой папки в «Моём Компьютере» будут плодиться сетевые диски с буквами Z: Y: X: и т.д. После перезагрузки они пропадут без следа.

И конечно же ссылка на код: http://codepad.org/rvFN13LI

А также полезные ссылки:
1. Работа с путями в BAT: http://www.microsoft.com/.....
2. И вообще по написанию BAT-ников: http://www.microsoft.com/.....

UPDATE:
Если вам довелось использовать этот чат по его прямому назначению, кхе-кхе)) Будьте добры оставьте комментарий о полученных ощущениях.