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

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

Автор: res2001
Дата сообщения: 06.08.2011 19:31
Mark_Titov
Ну ты же помнишь, что я писал про удаление старых файлов. Они будут удаляться время от времени.
Схема удаления такая: проводятся выборы (чтоб не слишком часто пытаться удалять), начинаем удалять если текущее количество минут >30, удаляем все файлы, дата и час изменения которых не равно текущему.
Так что каждый час файлы будут удалять, конечно в случае, если кто-то чатится.

Сделал приватные комнаты:
[more=Код]
Код: @echo off
color 1F
title Chat v 1.1
cls
if /i "%~1" equ "talk_widget" goto:talker

echo.
echo Введите номер комнаты для чата в числовом формате (1-999):
set /p "chat=>"
if not defined chat echo Вы ввели не правильный номер комнаты. & exit /b
set "chatpath=%~dp0\%chat%"
setlocal ENABLEDELAYEDEXPANSION
if exist %chatpath% (
    if exist %chat%_pass (
        call:setpass "Введите пароль для доступа в приватный чат:"
        set /p pass1=<%chat%_pass
        if "!pass!" neq "!pass1!" echo Вы ввели не правильный пароль для приватного чата. & pause & exit /b
    )
) else (
    call:setpass "Введите пароль (пустой пароль - публичный чат):"
    if defined pass (echo !pass!>%chat%_pass)
)
setlocal DISABLEDELAYEDEXPANSION
echo.
echo Придумайте свое имя для чат (А-Я \ A-Z):
set /p "nick=>"
if not defined nick echo Вы не ввели имя. & exit /b
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 "%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
Автор: Mark_Titov
Дата сообщения: 06.08.2011 19:31
Это мыизбавились я так понимаю от проблем с одновременным нажатием на ввод, правильно?

Добавлено:

Цитата:
Ну ты же помнишь, что я писал про удаление старых файлов. Они будут удаляться время от времени.

Понял, забыл... )))


Цитата:
Сделал приватные комнаты:

Щас по сети проверю, 10 мин....

Добавлено:
Пароль не принимает тот который установлен в чате, ввожу любой другой, он пускает в приват.
И если на пару минут оставить чат открытым в окно чата само пишется "dustman", это что?
Автор: res2001
Дата сообщения: 06.08.2011 19:44

Цитата:
Это мыизбавились я так понимаю от проблем с одновременным нажатием на ввод, правильно?

Да, как раз то что все сообщения находятся в отдельных файлах и делает их независимыми от коллизий.
Автор: Mark_Titov
Дата сообщения: 06.08.2011 19:46
Скрин видно?
Автор: res2001
Дата сообщения: 06.08.2011 19:58
Mark_Titov
Скрин видно.

Цитата:
Пароль не принимает тот который установлен в чате, ввожу любой другой, он пускает в приват.

У меня все путем. Может опять пробелы где-то мешаются, правда не могу понять где.

Цитата:
И если на пару минут оставить чат открытым в окно чата само пишется "dustman", это что?

Это как раз мусорщик сработал поправил этот момент. Обнови код.
Автор: Mark_Titov
Дата сообщения: 06.08.2011 20:09

Цитата:
Это как раз мусорщик сработал

А, понял.

Цитата:
поправил этот момент. Обнови код.

Почему-то только со второго раза понимает пароль, всегда. Т.е сначала просит, я ввожу, он второй раз просит (типа не верно), я то же самое ввожу, только тогда он просит имя придумать.
И вот еще глюк -

Это я просто с рабочего стола запустил его. А с сетевой шары все ок.

Добавлено:

Цитата:
Пароль не принимает тот который установлен в чате, ввожу любой другой, он пускает в приват.

Я ПОНЯЛ ЧТО ПРОИСХОДИТ.
Короче когда второй чел входит, чат просит ввести пароль (уже установленный первым челом) для привата. Тот вводит правильный пароль, и тут же выходит сообщение что мол ПРИДУМАЙТЕ пароль для чата. Соответственно второй чел может уже ввести совсем другой пароль, а старый перезапишется, и третий чел уже по первому паролю не сможет войти.

Добавлено:
Вот это окно входа в приват второго чела -


Добавлено:
По идее он не должен требовать второй раз ввод пароля, следующий пункт должен быть имя чела.
Автор: res2001
Дата сообщения: 06.08.2011 20:33
Mark_Titov
Не могу у себя воспроизвести такую ситуацию.
Такого не может быть , т.к. сообщения на ввод пароля разные, они находятся в разных ветках ifа и не могут пересекаться. Или я чего-то не понимаю
Автор: Mark_Titov
Дата сообщения: 06.08.2011 20:39
Вот еще прикол не большой -

Как видишь 2 пользователя в привате, первый так и не увидел что второй присоединился к чату (ждать будет до утра))), и сообщения некоторые теряются почему-то...

Добавлено:
Ну вот, пока я писал это сообщение чат просто простаивал и вылезла ошибка -


Добавлено:

Цитата:
Не могу у себя воспроизвести такую ситуацию.

А ты просто у себя сначало под одним юзером зайди, а потом под вторым и все.
А для ошибок нужно написать несколько сообшений и подождать 5-7 мин...
Автор: res2001
Дата сообщения: 06.08.2011 20:48
ТMark_Titov
Расскажи как ты запускал, чтоб получить такой результат.
Это по сети на разных компах?

Добавлено:

Цитата:
А ты просто у себя сначало под одним юзером зайди, а потом под вторым и все.

Я так иделаю.
Автор: Mark_Titov
Дата сообщения: 06.08.2011 20:51

Цитата:
Расскажи как ты запускал, чтоб получить такой результат.

С двойным пароле, да по сети на разных компах.
Автор: res2001
Дата сообщения: 06.08.2011 20:51
Обнови код, я там немного поправил сборщик мусора, может ошибки уйдут.
Кстати, что скопировать без пробелов открой мой пост для редактирования и так скопируй код.
Автор: Mark_Titov
Дата сообщения: 06.08.2011 20:51
Ошибки - локально...
Автор: res2001
Дата сообщения: 06.08.2011 21:00
10 минут висит 2 чата в на одной машине - ошибок нет. Сообщения то же не пропадали.
Автор: Mark_Titov
Дата сообщения: 06.08.2011 21:00
Обновил, двойной пароль остался и по сети и локально.
Плюс вот такая ошибка -



Добавлено:
Ошибка такая когда я с раб стола просто запускаю.

Добавлено:
А двойной пароль только со вторым и последующими пользователями происходит.
Автор: res2001
Дата сообщения: 06.08.2011 21:08
Mark_Titov
Ты без конечных пробелов скопировал?
Я запускал с раб.стола - тож все нормально, щаз вот еще юзера завел, запустил третий чат.
Ошибка говорит о том, что он пытается выполнить команду and, а такой команды в системе нет. Но и в батнике это слово встречается только в переменной %RANDOM%, не могу понять откуда может взяться такая ошибка. Воспроизвести у себя то же не могу.
И двойного пароля у меня нет. :-(

[more=Еще раз выкладываю код]
Код: @echo off
color 1F
title Chat v 1.1
cls
if /i "%~1" equ "talk_widget" goto:talker

echo.
echo Введите номер комнаты для чата в числовом формате (1-999):
set /p "chat=>"
if not defined chat echo Вы ввели не правильный номер комнаты. & exit /b
set "chatpath=%~dp0\%chat%"
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 password=!pass!>"%chat%_history")
)
setlocal DISABLEDELAYEDEXPANSION
echo.
echo Придумайте свое имя для чата (А-Я \ A-Z):
set /p "nick=>"
if not defined nick echo Вы не ввели имя. & exit /b
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" more +1 "%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
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 "%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 "usebackq tokens=1,2 delims==" %%a in ("%chat%_history") do (
    if /i "%%a" equ "password" set "pass1=%%b"
    exit /b
)
exit /b
Автор: Mark_Titov
Дата сообщения: 06.08.2011 21:14
щас пробелы посмотрю...
Автор: res2001
Дата сообщения: 06.08.2011 21:19
Ладна, хватит на сегодня.
В понедельник устрой тестирование по сети.
Кстати, можно будет написать автомат, чтоб он сам каждую секунду кидал сообщение. Будет стресстестирование
Автор: Mark_Titov
Дата сообщения: 06.08.2011 21:23

Цитата:
Ладна, хватит на сегодня.

Ок, спасибо тебе res2001, до понедельника.


Цитата:
Кстати, можно будет написать автомат, чтоб он сам каждую секунду кидал сообщение. Будет стресстестирование

Не плохая идея..!

Добавлено:
А по поводу ошибки с доступом, может там этот мусорщик вмешивается в процесс?
Автор: Mark_Titov
Дата сообщения: 07.08.2011 13:36
Вообщем проблема ошибки запуска с раб стола снимается, это оказывается только у меня такая проблема, на других компах нормально.
Получается осталась проблема с двойным вводом парода второго и последующих юзеров.
А так целый день тестил, вроде бы полет нормальный.

Добавлено:
И вот еще - мусорщик по-моему уволился ))))
За все время теста ни чего не удалилось...

Добавлено:
К стати, а почему бы не сделать что бы посланный текст записывался в новь созданный временный файл, и после вывода в окно чата сразу удалялся? Тогда и кучи файлов не будет и папок всяких и гемороя меньше. Как думаешь?
Автор: res2001
Дата сообщения: 07.08.2011 16:04
Mark_Titov

Цитата:
К стати, а почему бы не сделать что бы посланный текст записывался в новь созданный временный файл, и после вывода в окно чата сразу удалялся? Тогда и кучи файлов не будет и папок всяких и гемороя меньше. Как думаешь?

В самой первой версии так и было, но откуда ты знаешь сколько в данный момент пользователей смотрит чат, у скольких сообщение отобразилось у скольких нет. Нигде этого учета нет. Если делать так как ты пишешь, надо все это реализовывать, а это намного сложнее текущего варианта.

Цитата:
Вообщем проблема ошибки запуска с раб стола снимается, это оказывается только у меня такая проблема, на других компах нормально.

Может у тебя каталог рабочего стола не стандартный?

Мусорщика проверю.
Автор: Mark_Titov
Дата сообщения: 07.08.2011 16:10
Так файлы в папке будут удаляться, а сами папки остаются. Их как я понял в ручную нужно будет чистить?

Добавлено:

Цитата:
Может у тебя каталог рабочего стола не стандартный?

C:\Documents and Settings\Admin\Desktop
Как и у всех юзеров (только имена разные)
Автор: res2001
Дата сообщения: 07.08.2011 16:30
Mark_Titov

Цитата:
Так файлы в папке будут удаляться, а сами папки остаются. Их как я понял в ручную нужно будет чистить?

Пока папки остаются. Даже и не знаю, что с ними делать. Так же остаются файлы историй и пароли. Т.е. один раз зарегав комнату, можно в нее входить видя историю и используя тот же пароль.
Автор: Mark_Titov
Дата сообщения: 07.08.2011 16:47
Да, и пароль если можно как-нибудь в файл истории что ли вписывать в первую строку. Ну что бы сократить кол-во мусора.

Добавлено:

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

Вот-вот, это проблема...
Автор: res2001
Дата сообщения: 07.08.2011 16:52
Mark_Titov
Немного поправил код, может уйдет ошибка с рабочим столом. Хотя у себя ее так и не смог воспроизвести. Проверил мусорщик - нормально работает, все вчерашние файлы у меня сразу же грохнул.

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

Пароль, пожалуй, можно в файл истории пихнуть.

Добавлено:
Сделал пароль в файле истории. Обновил код.

Добавлено:
Mark_Titov

Цитата:
Вот-вот, это проблема...

В чем проблема?

Добавлено:
Кстати, кинь сюда вывод
dir /-c /a-d /od /tw
на любом каталоге, хочу посмотреть формат вывода.
и вывод
echo %date%-%time%
Может заморочки с мусорщиком у тебя связаны из-за различия отображения форматов даты/времени.
Автор: Mark_Titov
Дата сообщения: 07.08.2011 19:39

Цитата:
Кстати, кинь сюда вывод

07.08.2011-21:38:49,92

Добавлено:

Цитата:
Пароль, пожалуй, можно в файл истории пихнуть.


Код: password=000
Автор: Mark_Titov
Дата сообщения: 07.08.2011 23:09
По поводу файла истории, может этлементарно делать его сразу с атрибутом скрытый, что бы хотя бы юзеры не видели его?
А в привате вообще убрать историю, так как это приват же. Как думаешь?
Автор: res2001
Дата сообщения: 08.08.2011 07:45
Mark_Titov

Цитата:
Может лучше не палить что это пароль? Просто без password=

Можно без passwordа, но тогда надо его чем-то заменять. password= нужен для идентификации, что это действительно пароль, а не кусок сообщения. Предложи вариант идентификации, переделаю.
Идентифицировать наличие пароля надо для того чтоб отличить приватный чат от не приватного.

Цитата:
Не понятно что было..!?

Да нет, понятно стало, когда наткнулся. Непонятно, почему у меня работало, иначе сразу бы исправил.

Цитата:
Слушай, и второй пароль исчез..

???? а вот это не понятно ну да ладно.

Цитата:
А в привате вообще убрать историю, так как это приват же. Как думаешь?

А по моему история в привате очень даже на месте. Все равно приват то липовый, любой мало-мальски грамотный чел сможет узнать пароль.

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

Не плохая мысль, только я бы сделал скрытым только истории приватных чатов. Так сразу можно и идентифицировать, что это приватный чат и первая строка - пароль.
Согласен?
Автор: Mark_Titov
Дата сообщения: 08.08.2011 07:57

Цитата:
Идентифицировать наличие пароля надо для того чтоб отличить приватный чат от не приватного.

Ну это понятно. ))

Цитата:
Можно без passwordа, но тогда надо его чем-то заменять. password= нужен для идентификации, что это действительно пароль, а не кусок сообщения. Предложи вариант идентификации, переделаю.

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

Цитата:
любой мало-мальски грамотный чел сможет узнать пароль.

Согласен, может, ну это уже издержки я считаю. ))) Супер-пупер аутентификацию делать геморой однако.

Цитата:
Не плохая мысль, только я бы сделал скрытым только истории приватных чатов. Так сразу можно и идентифицировать, что это приватный чат и первая строка - пароль.
Согласен?

Согласен..
Автор: res2001
Дата сообщения: 08.08.2011 08:04
Mark_Titov

Цитата:
Согласен..

Ок. Буду делать.

Цитата:
Супер-пупер аутентификацию делать геморой однако.

Это точно, к тому же без дополнительных утилит будет не обойтись. Да и не нужно это. Кому понадобится подобная аутентификация пусть заюзают какой-нить клиент-серверный чат со всеми наворотами.
Автор: Mark_Titov
Дата сообщения: 08.08.2011 08:06

Цитата:
пусть заюзают какой-нить клиент-серверный чат со всеми наворотами.

Это точно..))

Страницы: 123

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


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