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

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

Автор: Mark_Titov
Дата сообщения: 03.08.2011 17:11
Здравствуйте уважаемые гуру.

Представляю вашему вниманию чат для локальной сети. Автор не я, нашел в сети.
Нужна ваша помощь в допиливании батничка чата для локальной сети.




Батник хорош тем что все реализованно в одном файле и только встроенными средствами!
Вот он сам - (тестировал на win XP, если кто может протестируйте пож-ста на win7)


Код: @echo off
color 1F
title Chat v 1.2
cls
pushd "%~dp0"
if "%~1" == "talk_widget" goto talker

set sndMsg=%SystemRoot%\Media\chimes.wav

:auth
echo.
echo.********************************************************************************
echo. —Ђ’ „‹џ ‹ЋЉЂ‹њЌЋ‰ ‘…’€ V 1.2
echo.********************************************************************************
echo.
echo.
echo.
echo.
echo ‚ўҐ¤ЁвҐ -®¬Ґа Є®¬- вл ¤«п з в  ў зЁб«®ў®¬ д®а¬ вҐ (1-999):
echo.
set /p chat=^>
echo.
echo ЏаЁ¤г¬ ©вҐ бў®Ґ Ё¬п ¤«п з в  (Ђ-џ \ A-Z):
echo.
set /p nick=^>
start call %0 talk_widget %chat% %nick%

:listener
cls
call title "| Љ®¬- в  з в : %chat% | Џ®«м§®ў вҐ«м: %nick% |"
if exist %chat%_history type %chat%_history
if not exist %chat% echo. 2>%chat%

:listener_loop
ping 127.0.0.1 -n 1 -w 20 > nul
set oldtext=%text%
set /p text=<%chat%
if not "%text%" == "%oldtext%" type %chat% & echo.
goto listener_loop

:talker
set chat=%~2
set nick=%~3
cls
call title "| Љ®¬- в  з в : %chat% | Џ®«м§®ў вҐ«м: %nick% |"
call ::cs_in
echo [%time:~0,-3%] Ї®«м§®ў вҐ«м "%nick%" ЇаЁб®Ґ¤Ё-Ё«бп Є з вг.>%chat%
call ::cs_out
echo [%time:~0,-3%] Ї®«м§®ў вҐ«м "%nick%" ЇаЁб®Ґ¤Ё-Ё«бп Є з вг.>>%chat%_history
echo. %msg% >>%chat%_history

:talker_loop
cls
echo.
echo ‚ и ⥪бв б®®ЎйҐ-Ёп:
echo.
set /p msg=^>
call ::cs_in
echo [%time:~0,-3%] - %nick%: >%chat%
echo - %msg% >>%chat%
start /min sndRec32.exe /play /close %sndMsg% 1>nul 2>nul
call ::cs_out
echo [%time:~0,-3%] - %nick%: >>%chat%_history
echo - %msg% >>%chat%_history
echo. >>%chat%_history
goto talker_loop

:cs_in
if exist "%chat%_cs" ping 127.0.0.1 -n 1 -w 50 > nul
set cs_value=%RANDOM%

:cs_in_loop
echo %cs_value%>%chat%_cs
set /p ret=<%chat%_cs
if "%ret%" == "%cs_value%" exit /b
ping 127.0.0.1 -n 1 -w 10 > nul
goto :cs_in_loop

:cs_out
del %chat%_cs
exit /b
Автор: res2001
Дата сообщения: 05.08.2011 14:42
Mark_Titov

Цитата:
Дело в том что я не силен в таких оборотах кода, я только пытаюсь еще..

Ну давай начнем.
Например надо создать уникальное имя файла для сообщения:
set msgfname=%chat%_%date:.=%%time::=%%RANDOM%
echo %msgfname%

И так далее, я говорю начни делать, я помогу где не понятно будет.
Автор: Mark_Titov
Дата сообщения: 05.08.2011 14:54

Цитата:
Ну давай начнем.

Ок, давай попробуем. Спасибо что помогаешь.

Цитата:
Например надо создать уникальное имя файла для сообщения:

Я добавил это, я так понимаю что это только пока мы задали переменную для этого файла, т.е. какое имя у него будет. Правильно?

Добавлено:
Только он прописал это уникальное имя в самом окне чата -

Автор: res2001
Дата сообщения: 05.08.2011 15:10
Mark_Titov
Вот процедуры talker и talker_loop с уникальным именем файла

Код:
:talker
set chat=%~2
set nick=%~3
cls
call title "| Комната чата: %chat% | Пользователь: %nick% |"
set msgfname=%chat%_%date:.=%%time::=%%RANDOM%
call ::cs_in
echo [%time:~0,-3%] пользователь "%nick%" присоединился к чату.>%msgfname%
echo [%time:~0,-3%] пользователь "%nick%" присоединился к чату.>>%chat%_history
echo. %msg% >>%chat%_history
call ::cs_out

:talker_loop
cls
echo.
echo Ваш текст сообщения:
echo.
set /p msg=^>
set msgfname=%chat%_%date:.=%%time::=%%RANDOM%
call ::cs_in
echo [%time:~0,-3%] - %nick%: >%msgfname%
echo - %msg% >>%msgfname%
start /min sndRec32.exe /play /close c:\WINDOWS\Media\chimes.wav 1>nul 2>nul
echo [%time:~0,-3%] - %nick%: >>%chat%_history
echo - %msg% >>%chat%_history
echo. >>%chat%_history
call ::cs_out
goto talker_loop
Автор: Mark_Titov
Дата сообщения: 05.08.2011 15:35
Да, он создал уникальный файл, только на каждое сообщение свой, и с с каждым сообщением они копятся, а содержание каждого файла такое -

Код: [17:33:12] - 2: ,7712983
- Привет ,7712983
Автор: res2001
Дата сообщения: 05.08.2011 15:57
Mark_Titov
Я сейчас делаю вывод в окно чата.
Как доделаю выложу.
Автор: Weinaum
Дата сообщения: 05.08.2011 16:00
Mark_Titov
идея понравилась, очень интересная, если данный чат допилится как надо, плз, выложите для рубордовцев окончательный вариант.
пс. что то не то туплю, но что то никак сам не вкурю ....а как подключиться к этому чату? т.е. вот я, допустим, на серверной машине с адресом 192.168.1.100 запустил батник, создал комнату, как теперь другой юзер из той же локальной сети, но на машине с адресом, скажем,
192.168.1.102 подключается к чату?
Автор: Mark_Titov
Дата сообщения: 05.08.2011 16:01
Спасибо тебе добрый человек, только если не затруднит в кратце хотя бы разъяснить, что бы я домчал хоть немного ))

Добавлено:
Weinaum

Цитата:
выложите для рубордовцев окончательный вариант.

На данный момент готовый вариант тот что в шапке (копируешь текст в батник и запускаешь).
Остальное пытаемся допилить.

Цитата:
пс. что то не то туплю, но что то никак сам не вкурю ....а как подключиться к этому чату?

Просто выкладываешь на ОБЩИЙ СЕТЕВОЙ РЕСУРС этот батник (желательно в отдельной папке), и каждый пользователь запускает его и все...
Там дальше все на русском...
НО УЧТИ ЧТО ЭТОТ ЧАТ ТОЛЬКО ДЛЯ ЛОКАЛЬНОЙ СЕТИ..! (НЕ ДЛЯ ИНТЕРНЕТА).
Автор: res2001
Дата сообщения: 05.08.2011 17:07
[more=Вот]
Код: @echo off
color 1F
title Chat v 1.1
cls
if /i "%~1" equ "talk_widget" goto:talker

:auth
echo.
echo Введите номер комнаты для чат в числовом формате (1-999):
echo.
set /p chat=^>
echo.
echo Придумайте свое имя для чат (А-Я \ A-Z):
set /p nick=^>
start call %0 talk_widget

set "msgflist=%TEMP%\chatlist.txt"
:listener
cls
title "| Chat: %chat% | User: %nick% |"
1>nul 2>&1 del /f /q "%msgflist%" & echo batchat>"%msgflist%"
1>nul 2>&1 md %~dp0\%chat%

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

:talker
cls
call title "| Комната чата: %chat% | Пользователь: %nick% |"
set "msgfname=%~dp0\%chat%\%date:.=%%time::=%%RANDOM%"
echo [%time:~0,-3%] пользователь "%nick%" присоединился к чату.>%msgfname%
call :cs_in
echo [%time:~0,-3%] пользователь "%nick%" присоединился к чату.>>%chat%_history
echo. %msg% >>%chat%_history
call :cs_out

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

:cs_in
if exist "%chat%_cs" call:wait 100 & goto:cs_in
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
Автор: Mark_Titov
Дата сообщения: 05.08.2011 17:14
Спасибо тебе res2001, буду тоже пробовать ковырятся, сюда буду выкладывать...
Автор: res2001
Дата сообщения: 05.08.2011 19:51
[more=Ну вот как-то так.]
Код: @echo off
color 1F
title Chat v 1.1
cls
if /i "%~1" equ "talk_widget" goto:talker

echo.
echo Введите номер комнаты для чат в числовом формате (1-999):
echo.
set /p chat=^>
echo.
echo Придумайте свое имя для чат (А-Я \ A-Z):
set /p nick=^>
set "chatpath=%~dp0\%chat%"
set "msgflist=%TEMP%\chatlist.txt"

cls
title "| Chat: %chat% | User: %nick% |"
1>nul 2>&1 md "%chatpath%"
>"%msgflist%" 2>nul dir /b /a-d /od /tw "%chatpath%\*" || >"%msgflist%" echo BatChat
if exist %chat%_history type %chat%_history
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
cls
call title "| Комната чата: %chat% | Пользователь: %nick% |"
call:getmsgfname
echo [%time:~0,-3%] пользователь "%nick%" присоединился к чату.>"%msgfname%"
call:cs_in
echo [%time:~0,-3%] пользователь "%nick%" присоединился к чату.>>%chat%_history
echo. %msg% >>%chat%_history
call:cs_out

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

:cs_in
if exist "%chat%_cs" call:wait 100 & goto:cs_in
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 "%chatpath%\dust.lck" exit /b 3
echo dustman >"%chatpath%\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" del /f /q "%chatpath%\%%~b"
1>nul 2>&1 del /f /q "%chatpath%\dust.lck"
exit /b

:getmsgfname
set "msgfname=%chatpath%\%date:.=%%time::=%%RANDOM%"
if exist "%msgfname%" goto:getmsgfname
exit /b
Автор: Mark_Titov
Дата сообщения: 05.08.2011 19:57
А У меня чего-то все папки пустые, сообщения не выводятся на экран и пишет что не может найти какой-то файл. Может потому что система английская?
Автор: res2001
Дата сообщения: 05.08.2011 20:06
Mark_Titov
Поправил код.
У меня нет возможности потестить в сети. Протестируй, плз.
Автор: Mark_Titov
Дата сообщения: 05.08.2011 20:13
Вот в этой секции проблема -

Код: :talker_loop
cls
echo.
echo Ваш текст сообщения:
echo.
set "msg="
set /p msg=^>
if not defined msg goto:talker_loop
call:getmsgfname
echo [%time:~0,-3%] - %nick%: >%msgfname%
echo - %msg% >>%msgfname%
call:cs_in
start /min sndRec32.exe /play /close c:\WINDOWS\Media\chimes.wav 1>nul 2>nul
echo [%time:~0,-3%] - %nick%: >>%chat%_history
echo - %msg% >>%chat%_history
echo.>>%chat%_history
call:cs_out
PAUSE
goto talker_loop
Автор: res2001
Дата сообщения: 05.08.2011 20:52
Поправил код.
Смотри
Автор: Mark_Titov
Дата сообщения: 05.08.2011 21:16
щас, скрин ошибки скину, погоди...

Добавлено:
Вообщем в историю пишется все, а на экран не выводит.
И еще если с рабочего стола запускаю (локально под админом), то не прерывно выводит на экран самого чата "пользователь "10" присоединился к чату." и полный путь к временному файлу.

Код: >"%msgflist%" 2>nul dir /b /a-d /od /tw "%chatpath%\*" || >"%msgflist%" echo BatChat
Автор: res2001
Дата сообщения: 06.08.2011 10:04
Mark_Titov
Оставил вчера отладочное сообщение по ошибке - убрал.
Поправил баг, обнови код.

Если захочешь поэкспериментировать и на одной машине запустить 2 чата, то их надо запускать от разных пользователей иначе они будут друг другу мешать.
Потестил у себя в таком режиме - вроде все работает.
Автор: Mark_Titov
Дата сообщения: 06.08.2011 13:42
res2001, у меня почему то при входе на любой машине постоянно пишет "пользователь "User" присоединился к чату", причем не переставая, и сообщение если написал в окно чата, тоже его постоянно дублирует. То есть получается последнее сообщение не прерывно дублирует.
Автор: res2001
Дата сообщения: 06.08.2011 16:13
Mark_Titov
У меня все нормально.
Проверь в каталоге %TEMP% создается файл chatlist.txt?
В него должны добавлятся имена файлов, которые были выведены на экран.
Похоже, что у тебя не создается chatlist.txt.
Может у тебя нет каталога, заданного переменной %TEMP%, проверь.

Для пробы можно в батнике поменять место расположения chatlist.txt и посмотреть, как будет работать.
Автор: Mark_Titov
Дата сообщения: 06.08.2011 16:19
Создается, вот что там -

06082011181648,625721
06082011181715,665810
06082011181715,665810
06082011181715,665810
06082011181715,665810
06082011181715,665810


Добавлено:
Может ты на win7.?
Автор: res2001
Дата сообщения: 06.08.2011 16:26
нет, у меня ВинХП СП3 рус.
Проверь, нет ли в строках в chatlist.txt лишни пробелов в конце. У меня поначалу был такой глюк, долго искал причину, но теперь я его давно уже устранил. А у тебя все еще не устранился.
Автор: Mark_Titov
Дата сообщения: 06.08.2011 17:36
да, есть, начиная со второй строки...
Автор: res2001
Дата сообщения: 06.08.2011 17:46
Mark_Titov
А ты весь код скопировал?
Автор: Mark_Titov
Дата сообщения: 06.08.2011 17:48
Да, весь..

Добавлено:
Еще и несколько раз проверил...

Добавлено:
...то что у меня инглишь не должно влиять вроде бы на код.
Автор: res2001
Дата сообщения: 06.08.2011 17:52
Пробелов в конце не должно быть, иначе findstr не правильно отрабатывает.
Проверь эту строку в listener_loop:
echo %%~a>>"%msgflist%"
Пробела между a и > не должно быть.
Автор: Mark_Titov
Дата сообщения: 06.08.2011 17:56
Нет, там пробелов нет, пробел в конце был (при копировании с форума ставятся), убрал и все стало работать.
Щас по сетке проверю, погоди...

Добавлено:
Да, вроде бы работает, только опять лепит сообщения, все сливается, нужен пробел между сообщениями пользователей...
Автор: res2001
Дата сообщения: 06.08.2011 18:05
Mark_Titov
афигеть, не думал, что пробел в конце будет такой эффект оказывать.
Поправил код, чтоб в этом месте пробелы не влияли на работу.
Автор: Mark_Titov
Дата сообщения: 06.08.2011 18:08
Да, теперь не влияют, а где поставить пробел между сообщениями пользователей?
Автор: res2001
Дата сообщения: 06.08.2011 18:25
Добавил пробелы.
[more=Код тут]
Код: @echo off
color 1F
title Chat v 1.1
cls
if /i "%~1" equ "talk_widget" goto:talker

echo.
echo Введите номер комнаты для чат в числовом формате (1-999):
echo.
set /p chat=^>
echo.
echo Придумайте свое имя для чат (А-Я \ A-Z):
set /p nick=^>
set "chatpath=%~dp0\%chat%"
set "msgflist=%TEMP%\chatlist.txt"

cls
title "| Chat: %chat% | User: %nick% |"
1>nul 2>&1 md "%chatpath%"
>"%msgflist%" 2>nul dir /b /a-d /od /tw "%chatpath%\*" || >"%msgflist%" echo BatChat
if exist %chat%_history type %chat%_history
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
cls
call title "| Комната чата: %chat% | Пользователь: %nick% |"
call:getmsgfname
echo [%time:~0,-3%] пользователь "%nick%" присоединился к чату.>"%msgfname%"
echo. >>"%msgfname%"
call:cs_in
echo [%time:~0,-3%] пользователь "%nick%" присоединился к чату.>>%chat%_history
echo. >>%chat%_history
call:cs_out

:talker_loop
cls
echo.
echo Ваш текст сообщения:
echo.
set "msg="
set /p msg=^>
if not defined msg goto:talker_loop
call:getmsgfname
echo [%time:~0,-3%] - %nick%: >"%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%: >>%chat%_history
echo - %msg% >>%chat%_history
echo. >>%chat%_history
call:cs_out
goto talker_loop

:cs_in
if exist "%chat%_cs" call:wait 100 & goto:cs_in
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 "%chatpath%\dust.lck" exit /b 3
echo dustman >"%chatpath%\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" del /f /q "%chatpath%\%%~b"
1>nul 2>&1 del /f /q "%chatpath%\dust.lck"
exit /b

:getmsgfname
set "msgfname=%chatpath%\%date:.=%%time::=%%RANDOM%"
if exist "%msgfname%" goto:getmsgfname
exit /b
Автор: Mark_Titov
Дата сообщения: 06.08.2011 18:40
Клево..!
Слушай, это получается что на каждое сообщение отдельный файл он делает и папка за целый день радувается в объеме?

Страницы: 123

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


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