Ru-Board.club
← Вернуться в раздел «Программы»

» Консольный чат для локальной сети.

Автор: res2001
Дата сообщения: 08.08.2011 12:36
[more=Очередная версия]
Код: @echo off
color 1F
title Chat v 1.1
cls
if /i "%~1" equ "talk_widget" call:talker %2 %3 & exit /b

echo.
echo Введите номер комнаты для чата в числовом формате (1-999):
set /p "chat=>"
if not defined chat echo Вы ввели не правильный номер комнаты. & exit /b
set "chatpath=%~dp0\%chat%"
1>nul 2>&1 md "%chatpath%"
set "skiprow=0"
setlocal ENABLEDELAYEDEXPANSION
if exist "%chat%_history" (
    call:getpass
    if defined pass1 (
        call:setpass "Введите пароль для доступа в приватный чат:"
        if "!pass!" neq "!pass1!" echo Вы ввели не правильный пароль для приватного чата. & pause & exit /b
    )
) else (
    call:setpass "Введите пароль (пустой пароль - публичный чат):"
    if defined pass (
        echo.!pass!>"%chat%_history"
        attrib +h "%chat%_history"
        attrib +h "%chatpath%"
    )
)
setlocal DISABLEDELAYEDEXPANSION
if defined pass set "privat= [приватная]" & set "skiprow=1"
if /i "%1" equ "talk_auto" (set "auto=[Автомат]") else (
    echo.
    echo Придумайте свое имя для чата ^(А-Я \ A-Z^):
    set /p "nick=>"
    if not defined nick echo Вы не ввели имя. & exit /b
)
set "msgflist=%TEMP%\chatlist.txt"
set cs_in=0

cls
title "| Комната чата: %chat%%privat% | Пользователь: %nick%%auto% |"
>"%msgflist%" 2>nul dir /b /a-d /od /tw "%chatpath%\*" || >"%msgflist%" echo BatChat
if exist "%chat%_history" more +%skiprow% "%chat%_history" | findstr /r ".*"
start call %0 talk_widget %*

:listener_loop
for /f "tokens=*" %%a in ('dir /b /a-d /od /tw "%chatpath%\*" 2^>nul ^| findstr /v /G:"%msgflist%" 2^>nul') do (
    echo %%~a>>"%msgflist%"&type "%chatpath%\%%~a"
)
call:dustman || call:wait 1000
goto:listener_loop

:talker
setlocal ENABLEDELAYEDEXPANSION
cls
title "| Комната чата: %chat%%privat% | Пользователь: %nick%%auto%|"
call:getmsgfname
echo [%time:~0,-3%] пользователь "%nick%%auto%" присоединился к чату.>"%msgfname%"
echo. >>"%msgfname%"
call:cs_in
echo [%time:~0,-3%] пользователь "%nick%%auto%" присоединился к чату.>>"%chat%_history"
echo. >>"%chat%_history"
call:cs_out

:talker_loop
cls
echo.
echo Ваш текст сообщения:
echo.
set "msg="
if /i "%1" neq "talk_auto" (set /p msg=^>) else (set msg=%RANDOM% & echo.^>!msg!)
if not defined msg goto:talker_loop
call:getmsgfname
echo [%time:~0,-3%] - %nick%%auto%:>"%msgfname%"
echo - %msg%>>"%msgfname%"
echo.>>"%msgfname%"
call:cs_in
start /min sndRec32.exe /play /close c:\WINDOWS\Media\chimes.wav 1>nul 2>nul
echo [%time:~0,-3%] - %nick%%auto%:>>"%chat%_history"
echo - %msg%>>"%chat%_history"
echo.>>"%chat%_history"
call:cs_out
if /i "%1" equ "talk_auto" (if "%2" equ "" (call:wait 1000) else call:wait %2)
goto talker_loop

:cs_in
if exist "%chat%_cs" (
    call:wait 1000
    set /a cs_in+=1
    if !cs_in! lss 5 goto:cs_in
)
set cs_in=0
echo %RANDOM% >%chat%_cs
exit /b

:cs_out
1>nul 2>&1 del /f /q %chat%_cs
exit /b

:wait
1>nul 2>&1 ping -n 1 -w %1 127.255.255.255
exit /b

:dustman
set "cleanborder=6553"
if %RANDOM% gtr %cleanborder% exit /b 1
if %time:~3,2% lss 30 exit /b 2
if exist "%chat%_dust.lck" exit /b 3
echo dustman >"%chat%_dust.lck"
for /f "skip=4 tokens=1,4" %%a in ('dir /-c /a-d /od /tw "%chatpath%\*" 2^>nul ^| findstr /b /v /c:"%date% %time:~0,3%" 2^>nul') do if exist "%chatpath%\%%~b" 1>nul 2>&1 del /f /q "%chatpath%\%%~b"
1>nul 2>&1 del /f /q "%chat%_dust.lck"
exit /b

:getmsgfname
set "msgfname=%chatpath%\%date:.=%%time::=%%RANDOM%"
if exist "%msgfname%" goto:getmsgfname
exit /b

:setpass
echo.&echo.%~1
set "pass="
set /p "pass=>"
exit /b

:getpass
set "pass1="
if not exist "%chat%_history" exit /b
for /f "tokens=* delims=" %%a in ('attrib "%chat%_history" ') do (
    set "att=%%a"
    if /i "!att:~4,1!" equ "H" (set /p pass1=<"%chat%_history")
)
set "att="
exit /b
Автор: Mark_Titov
Дата сообщения: 08.08.2011 12:38
Благодарю res2001, сейчас буду тестить...

Добавлено:

Цитата:
запускай батник с параметром talk_auto

Из командной строки чтоль?!
Или в коде?

Добавлено:
Я там вижу :talkerauto, а как его запустить, он вроде не закоментирован?

Добавлено:
И еще, скажи, собирающийся мусор в таком формате это нормально?

Код: 08082011144209,363668
Автор: res2001
Дата сообщения: 08.08.2011 13:09

Цитата:
Из командной строки чтоль?!

Да из ком.строки при запуске батника указывай параметр.

Поправил код, нашел ошибку связанную с ... если закрыть крестом окно ввода сообщений в определенный момент, то может остаться не удаленным файл флаг блокировки записи в файл истории (%chat%_cs), и все чатеры подвисают, не могут отправить сообщение пока файл не удалится.
Сделал обхот по такому алгоритму - если в течение 5 сек. файл %chat%_cs не удаляется, значит считаем, что как раз такая ситуация и игнорируем наличие флага, т.е. начинаем писать в файл истории. Потом, после записи, этот файл удаляется.

Добавлено:

Цитата:
И еще, скажи, собирающийся мусор в таком формате это нормально?

Если мусор убирается, то нормально.

Цитата:
Может папку с мусором тоже скрытой сделать?

можно

Добавлено:
сделано
Автор: Mark_Titov
Дата сообщения: 08.08.2011 13:18
Запустил автотестирование, вот такая ошибка -



Добавлено:
и на авто, я не видно папки с сообщениями, даже скрытой...
Автор: res2001
Дата сообщения: 08.08.2011 13:46
Обнови код.
Сделал автомат в таком же режиме как ручной чат, т.е. создается окно чата и окно ввода. Как обычно.
Ошибка, думаю, должна уйти.
Автор: Mark_Titov
Дата сообщения: 08.08.2011 13:55
Ошибка исчезла.
Автотестирование я так понимаю только локально можно запускать, по сети одновременно с нескольких компов в одну комнату чата никак да?

Добавлено:
К стати, верни пож-ста заголовок при автомате "АВТОТЕСТИРОВАНИЕ", полезно однако видеть что это режим-автомат.

Добавлено:
Да и в заголовке для привата тоже напиши пож-ста не просто "Комната чата", а "Приватная комната чата", если не затруднит. Что бы видеть где приват, а где общий чат.

Добавлено:
Е-мае, за 30 мин автотестирования смотри сколько их -



А чего мусорщик не чистит?
Автор: res2001
Дата сообщения: 08.08.2011 15:08

Цитата:
А чего мусорщик не чистит?

Мусорщик должен чистить файлы с датой/временем модификации не равной текущей дате и текущему часу. Так же он запускается, когда количество минут >30.
Т.е. от текущего времени он начнет запускаться в 16:30 и удалит все файлы созданные до 08.08.2011 16:00.
Протестируй. Можно время перевести, я у себя так его тестировал.

Цитата:
Автотестирование я так понимаю только локально можно запускать, по сети одновременно с нескольких компов в одну комнату чата никак да?

Можно и по сети. Алгоритм работы робота такой же как и в ручном режим, со всеми блокировками, проверками и т.п.
Автор: Mark_Titov
Дата сообщения: 08.08.2011 15:12
А по поводу заголовков окна приватного чата и режима теста можно прописать? А то я уже в коде там запутался )))...

Добавлено:
Кстати, попробуй локально (не по сети) второго пользователя в автотесте приватного чата запустить, у меня пароль говорит не верный...
Автор: res2001
Дата сообщения: 08.08.2011 15:48
Mark_Titov

Цитата:
А по поводу заголовков окна приватного чата и режима теста можно прописать?

сделал. обновляйся.

Цитата:
Кстати, попробуй локально (не по сети) второго пользователя в автотесте приватного чата запустить, у меня пароль говорит не верный...

у меня нормально все. и по сети автомат гонял и на одной машине под разными пользователями.

Добавлено:
Может у тебя и правда пароль не правильный был?
Ну там може русский по умолчанию или наоборот, или капс включен.

Добавлено:
Мусорщик у тебя работает?
Автор: Mark_Titov
Дата сообщения: 08.08.2011 16:01

Цитата:
Может у тебя и правда пароль не правильный был?

Да тупо 000 поставил и все - не принимает зараза )))

Цитата:
Мусорщик у тебя работает?

Через 20 мин будет пол часа, отпишусь...

Цитата:
сделал. обновляйся.

Спасибо, щас обновлюсь.

Добавлено:
Ну вот например с права окно первого юзера, с лева пытаюсь завести в приват второго -



И самое что прикольное, закрывая крестиком окно самого чата, окно ввода текста продолжает отсылать сообщения. Может все таки получится в автотестировании не выводить окно ввода текста? Или геморойно?

Добавлено:
Да, и в аторежиме ты классно придумал [Автомат], может вообще при тестировании убрать пункт "Введите имя пользователя"? Просто будет -

Код: [18:14:23] - [Автомат]:
- 571277
Автор: res2001
Дата сообщения: 08.08.2011 16:27

Цитата:
И самое что прикольное, закрывая крестиком окно самого чата, окно ввода текста продолжает отсылать сообщения. Может все таки получится в автотестировании не выводить окно ввода текста? Или геморойно?

Вобщем да, геморойно, да и не нужно. Это все таки фишка для тестирования не более того.
Сейчас я робота очень удачно прикрутил в процедуру ручного чата, добавил только пару if и все. А чтоб отказаться от окна ввода, придется перекраивать процедуру чата. Вобщем, нафиг надо.
У меня с паролями все путем. Опять не могу воспроизвести твою ошибку.
Может у юзера прав на каталог нет?

Добавлено:

Цитата:
Как думаешь?

можно

Добавлено:
готово.
Обновляйся.
Что мусорщик?
Автор: Mark_Titov
Дата сообщения: 08.08.2011 16:56
Мусорщик сработал, а можно время очистки уменьшить до 5 минут хотябы? Столько хлама там.
Если человек 20-30 хотябы будут в чате это туча мусора сразу, а если больше 30, представляешь?

Добавлено:

Цитата:
Может у юзера прав на каталог нет?

Сижу под админом.
Автор: Mark_Titov
Дата сообщения: 09.08.2011 01:20
res2001, вообщем проблема двойного пароля (ты будешь смеяться) была в лишних пробелах в конце кода. Убрал - все пошло на ура.
У меня вопрос, в коде есть строка -

Код: >"%msgflist%" 2>nul dir /b /a-d /od /tw "%chatpath%\*" || >"%msgflist%" echo BatChat
Автор: res2001
Дата сообщения: 09.08.2011 07:41
Mark_Titov

Цитата:
...так вот то что выделенно красным, это что?

Смысл этой строки вообще в том, чтобы при запуске чата в случае если каталог с сообщениями не пустой сгенерить список отображенных файлов из уже существующих в каталоге файлов. Т.к. первоначальное отображени идет из файла истории, то отображать существующие в каталоге файлы не надо.
А то что выделено красным - это для варианта когда в каталоге нет файлов, чтоб просто создать файл отображенных файлов, а строка BatChat - ну это просто строка, которая заведомо не будет содержаться в именах файлов.

Цитата:
set "cleanborder=6553"

Нет это не время. Это 20% от максимально возможного числа, возвращаемого переменной %RANDOM%, эта цифра как раз и отвечает за "выборы" будем чистить или не будем. Т.е. чистка мусора происходит примерно в 20% случаев в заданном интервале времени.

Цитата:
Мусорщик сработал, а можно время очистки уменьшить до 5 минут хотябы?

Можно, сделаю.

Цитата:
Столько хлама там.

Куча хлама у тебя образуется от работы роботы, в реальной жизни столько сообщений не будет, имхо.

Цитата:
...а хотелось бы такой -

можно, но нужно ли. Сейчас это просто то что возвращает %time%. Зачем навешивать лишнее? Я бы не делал.

Цитата:
соответственно ошибки были и на экран лезли.

Какие ошибки, закинь скрины. У меня не было ошибок.

Цитата:
К стати, попробуй в место номера комнаты, пароля, имени ввести звездочки, слеши, точки и запятые.
Вот как от этого избавится, я не знаю... Может в коде прописать что бы только цифрами вводили?

Все служебные символы cmd нельзя будет использовать в пароле, скорее всего.
Протестирую этот момент.

Цитата:
Я там не много поправил (косметика в основном)...

Зачем по убирал весь формат кода




Добавлено:
Кстати, тестировал тут на компе, где нет аудио, т.е. совсем нет - постоянно вылазит окно с ошибкой от sndrec32. В общем то не страшно - оно даже не останавливает процесс, но надо жмякать на Ок, чтоб его убрать. Неприятно в общем.
Думаю, может сделать переменную, типа будем музыку играть или нет?

Добавлено:
Кстати sndrec32 под Вин7 нет.
Протестировал пароли из спец.символов cmd - все нормально прокатывает. Сам удивился.
Если у тебя ошибки, давай скрины и какой пароль в это время выставлен.
Так же тестил с 3 роботами на одном компе под разными юзерами - не было ни одной ошибки.

Добавлено:
Тестировал твоим вариантом.

Добавлено:
Проблемы есть, в случае наличия спец.символов в номере комнаты. Но это уже файловая система виновата, ничего тут не сделать.
Автор: Mark_Titov
Дата сообщения: 09.08.2011 09:08

Цитата:
Кстати, тестировал тут на компе, где нет аудио, т.е. совсем нет - постоянно вылазит окно с ошибкой от sndrec32.

Где нет аудио можно бипером играть, вот возми тут -
Бипер
На семерке бипером воспроизводить.

Добавлено:
Я тут нарыл еще один чат, чувак круто начал, но все громоздко.
Может что найдешь для реализации в нашем варианте. Вообщем для разбора-
ЧАТ ДЛЯ РАЗБОРА
Автор: res2001
Дата сообщения: 09.08.2011 09:22
Mark_Titov
бипером то можно играть, только как определить, что на компе нет аудио, вот в чем вопрос.
Я пока ответа не знаю.
Разве, что везде бипером играть.

Добавлено:
Mark_Titov

Цитата:
Я тут нарыл еще один чат, чувак круто начал, но все громоздко.

Посмотрел. Схема работы там не такая как у нас - там клиент-серверная архитектура, т.е. на сколько я понял запускается серверная часть на выделенной машине, клиенты шлют запросы серверу, сервер генерит ответы в файлы. Запросы/ответы так же передаются через файлы.
Комнат вроде нет, весь чат в одной комнате. Чтоб сделать другую комнату надо сервер запускать в другом каталоге и изменять файл конфигурации у клиента.
К тому же никаких блокировок и синхронизации там и в помине нет, а это не правильно.
По моему там много лишнего наворочено. Удивляет обилие @

У меня в начале тоже была идея о клиент-серверной архитектуре. Для чата это правильней. Но батниками все равно нормально это не сделать, поэтому выбрал наш путь.
Автор: res2001
Дата сообщения: 09.08.2011 14:51
[more=Очередная версия.]
Код: @echo off
:1
color 1F
title Chat v 2.0
set sndMsg=%SystemRoot%\Media\chimes.wav
cls
if /i "%~1" equ "talk_widget" call:talker %2 %3 & exit /b
echo.
echo.************************* Чат для локальной сети V 2.0 *************************
echo.
echo.
echo Введите номер комнаты для чата в числовом формате (1-999):
set /p "chat=>"
if not defined chat echo. & goto :1
set "chatpath=%~dp0\%chat%"
1>nul 2>&1 md "%chatpath%"
set "skiprow=0"
setlocal ENABLEDELAYEDEXPANSION
if exist "%chat%_history" (
call:getpass
if defined pass1 (
call:setpass "Введите пароль для доступа в приватный чат:"
if "!pass!" neq "!pass1!" echo Введен не верный пароль для приватного чата, Нажмите любую клавишу для выхода. & echo. & pause & exit /b
)
) else (
call:setpass "Введите пароль (пустой пароль - публичный чат):"
if defined pass (
echo.!pass!>"%chat%_history"
attrib +h "%chat%_history"
attrib +h "%chatpath%"
)
)
:2
setlocal DISABLEDELAYEDEXPANSION
if defined pass set "privat= [Приватный чат]" & set "skiprow=1"
if /i "%1" equ "talk_auto" (set "auto=[Автотест]") else (
echo.
echo Придумайте свое имя для чата ^(А-Я \ A-Z^):
set /p "nick=>"
if not defined nick echo Вы не ввели свое имя для чата. & goto :2
)
set "msgflist=%TEMP%\chatlist.txt"
set cs_in=0
cls
title "| Комната чата: %chat%%privat% | Пользователь: %nick%%auto% |"
>"%msgflist%" 2>nul dir /b /a-d /od /tw "%chatpath%\*" || >"%msgflist%" echo BatChat
if exist "%chat%_history" more +%skiprow% "%chat%_history" | findstr /r ".*"
start call %0 talk_widget %*

:listener_loop
for /f "tokens=*" %%a in ('dir /b /a-d /od /tw "%chatpath%\*" 2^>nul ^| findstr /v /G:"%msgflist%" 2^>nul') do (
echo %%~a>>"%msgflist%"&type "%chatpath%\%%~a"
)
call:dustman || call:wait 1000
goto:listener_loop

:talker
setlocal ENABLEDELAYEDEXPANSION
cls
title "| Комната чата: %chat%%privat% | Пользователь: %nick%%auto%|"
call:getmsgfname
echo [%time:~0,-3%] пользователь "%nick%%auto%" присоединился к чату.>"%msgfname%"
echo. >>"%msgfname%"
call:cs_in
echo [%time:~0,-3%] пользователь "%nick%%auto%" присоединился к чату.>>"%chat%_history"
echo. >>"%chat%_history"
call:cs_out

:talker_loop
cls
echo.
echo Ваш текст сообщения:
echo.
set "msg="
if /i "%1" neq "talk_auto" (set /p msg=^>) else (set msg=%RANDOM% & echo.^>!msg!)
if not defined msg goto:talker_loop
call:getmsgfname
echo [%time:~0,-3%] - %nick%%auto%:>"%msgfname%"
echo - %msg%>>"%msgfname%"
echo.>>"%msgfname%"
call:cs_in
call:playsound
echo [%time:~0,-3%] - %nick%%auto%:>>"%chat%_history"
echo - %msg%>>"%chat%_history"
echo.>>"%chat%_history"
call:cs_out
if /i "%1" equ "talk_auto" (if "%2" equ "" (call:wait 1000) else call:wait %2)
goto talker_loop

:cs_in
if exist "%chat%_cs" (
call:wait 1000
set /a cs_in+=1
if !cs_in! lss 5 goto:cs_in
)
set cs_in=0
echo %RANDOM% >%chat%_cs
exit /b

:cs_out
1>nul 2>&1 del /f /q %chat%_cs
exit /b

:wait
1>nul 2>&1 ping -n 1 -w %1 127.255.255.255
exit /b

:dustman
set "cleanborder=6553"
if %RANDOM% gtr %cleanborder% exit /b 1
if %time:~3,2% lss 10 exit /b 2
if exist "%chat%_dust.lck" exit /b 3
echo dustman >"%chat%_dust.lck"
for /f "skip=4 tokens=1,4" %%a in ('dir /-c /a-d /od /tw "%chatpath%\*" 2^>nul ^| findstr /b /v /c:"%date% %time:~0,3%" 2^>nul') do if exist "%chatpath%\%%~b" 1>nul 2>&1 del /f /q "%chatpath%\%%~b"
1>nul 2>&1 del /f /q "%chat%_dust.lck"
exit /b

:getmsgfname
set "msgfname=%chatpath%\%date:.=%%time::=%%RANDOM%"
if exist "%msgfname%" goto:getmsgfname
exit /b

:setpass
echo.&echo.%~1
set "pass="
set /p "pass=>"
exit /b

:getpass
set "pass1="
if not exist "%chat%_history" exit /b
for /f "tokens=* delims=" %%a in ('attrib "%chat%_history" ') do (
set "att=%%a"
if /i "!att:~4,1!" equ "H" (set /p pass1=<"%chat%_history")
)
set "att="
exit /b

:playsound
ver | findstr /c:"Windows XP" >nul || (echo  & exit /b)
sndRec32.exe /embedding /play /close %sndMsg%
exit /b
Автор: Mark_Titov
Дата сообщения: 11.08.2011 17:55
res2001, извини что не отвечал долго, проблемы с инетом, код обновил, но что-то звука пока нет.
Я переодически как с инетом будет по проще буду выходить сюда.
Больше ошибок пока не обнаружил, но тестирование в процессе.
Автор: res2001
Дата сообщения: 12.08.2011 07:29
Поправил звук.

Страницы: 123

Предыдущая тема: Secunia Personal Software Inspector (PSI)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.