Desktop-ный чат на Delphi с поддержкой ников, комнат, статусов, проброса портов и клиент-серверной архитектурой (на сокетах)

Во времена службы в армии, был это 2013 год, начал я чатик тогда делать. Не помню, для чего и почему, но помню, что было интересно и увлекательно его делать. Оно и понятно! Когда сидишь и никуда не можешь уйти, когда свобода ограничена, мозг начинает из того, что есть, придумывать себе задания, чтоб не скучать. А задание это было, кстати, довольно крутым 🙂
Даже позже, когда уже закончилась служба в армии, часто вспоминал то время, как продуктивно получалось тогда что-то делать, потому что не было никаких отвлекающих факторов (ну, почти. Были ещё основные задания тоже, конечно же), и деться никуда не можешь, и люди не отвлекают. Плюс режим и распорядок дня тоже делали своё хорошее дело 🙂
Даже мысли потом бывали, что было бы круто сделать армию чисто для программистов, где есть и распорядок дня, и физическая подготовка (это тоже важно для мозгов), и в остальное время сидишь и пилишь код! Это было бы круто!
Но что-то я немножко от темы отступил, слишком длинное предисловие получилось…

Так вот! Чатик ещё не доделан до конца до сих пор, но пользоваться им уже можно, потому что основной функционал уже присутствует и работает, а именно:

  • выбор ника и его регистрация паролем (чтоб другие не могли его использовать)
  • общение в комнатах (как каналы в IRC)
  • пароль на комнату (вход будет только по этому паролю, а кто комнату создал, тот и владелец, он сможет пароль сменить)
  • комнаты размещаются во вкладках, которые, в свою очередь, являются дочерними окнами главного окна и располагаются внутри него
  • возможность общаться приватно (с указанием причины или без, но другой пользователь должен позволить или отказать в запросе на приват)
  • возможность менять фон главного окна (градиент, текстура, рисунок). Не знаю, зачем это, но да ладно 😀
  • статусы! Да, есть там статусы, типа «на месте», «занят», «отошёл» и возможность текст статуса установить. Статусы отображаются в списке пользователей комнаты
  • можно вписать информацию о себе (только если ник зареган), которую могут посмотреть другие пользователи. Там базовая инфа: ФИО, email, город (вроде), плюс просто поле для ввода любой другой информации о себе
  • трей-иконка! (а куда ж без неё). При входящих сообщениях значок меняется на конвертик. Если окно чата не свёрнуто в трей, но при этом не в фокусе, то кнопка на панели задач мигает при событиях или сообщениях
  • оповещения о наборе текста тоже есть. Отображаются в списке пользователей, прям как в старых ICQ-клиентов для телефонов с J2Me ))
  • поддержка некоторых BB-кодов. Можно немножко отформатировать текст (жирный, курсив, чёркнутый, имя шрифта и размер сменить и цвет)
  • поддержка консольных команд и горячих клавиш. Например, можно нажать на кнопку на панельке или в меню, а можно нажать Ctrl+J и ввести имя комнаты, в которую надо зайти, либо набрать в поле ввода сообщений команду /join #room_name. И всё это для того, чтобы войти в комнату! Надо же! )
  • есть что-то вроде файлового менеджера, но он вообще не доделан, но там есть виртуальные папки users и rooms, в которых можно посмотреть текущих подключенных к серверу пользователей и их IP адреса (ай-ай-ай!!!), а также посмотреть текущие активные комнаты и количество пользователей в них. Выглядит это вот так (нужно обратить внимание на «размер» комнат):
  • возможность работы через разные типы прокси (http, socks4, socks5 с авторизацией или без)
  • возможность работы по SSL, но эта штука работает коряво и я сам не понимаю и не помню, как тогда сделал, что на одном порту всё висит и есть возможность подключаться и по SSL, и без него… ) Какая-то магия или костыли ))
  • возможность сохранять переписки из чатов в обычный текст или как RTF-файл (с сохранением форматирования текста)
  • небольшая консолька (не доделано ещё) для ввода команд отдельно, без окна чата
  • возможность от клиента к клиенту пробрасывать порты (работает через сервер, поэтому NAT не страшен). Это вообще дикая штука! Работает оно так: слушается локальный порт у одного пользователя, и все обращения к этому порту прозрачно через чат, через сервер пробрасываются до другого клиента, до хоста и порта, который указан в настройках подключения моста. Это значит, что можно, например, от одного клиента подключиться напрямую (прозрачно, через чат и сервер) к сервису другого клиента чата, например, к удалённому рабочему столу, либо к VNC, либо к роутеру (чтоб, например, помочь что-то настроить), или ещё к чему угодно! И это круто! И это всё тоже может работать через прокси, который настроен в настройках чата.
  • возможность при подключении к серверу заходить в определённые комнаты (задаётся в настройках). По умолчанию клиенты заходят в комнату #main.
  • как уже, думаю, стало понятно, чат имеет клиент-серверную архитектуру. Где-нибудь нужно запустить сервер, указать ему порт (в файле конфигов), открыть этот порт наружу или.. ну, в общем, позаботиться о том, чтобы к этому серверу могли извне подключаться. А клиентам нужно будет уже в настройках задать тот самый адрес и порт, и всё будет работать 🙂  Можно, конечно, и в локалке использовать без проблем, никто этому не мешает, работать тоже будет!

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

Некоторые настройки чатика

Многооконный режим чатика и общая комната

Вход в защищённую паролем комнату

Список мостов (ещё не работает, но так должно выглядеть)

Добавление моста (это работает). Есть возможность сохранять их и быстро подключаться потом

Автодополнение команд в консольке (нажать Ctrl+Space)

Автодополнение пока что работает только в консольке, которая отдельно. А сама консолька ничего не выводит — не доделано это. Но автодополнения нет в поле для ввода текста. Но это всё ещё впереди! Зато в текстовом поле для ввода сообщение можно нажимать Ctrl+Стрелка_Вверх или Ctrl+Стрелка_Вниз, чтобы прокручивать историю сообщений.
В консольке можно команды вводить просто, а в поле для ввода сообщений команды нужно начинать со слеша (/).

Поддерживаются следующие команды:

  • info <message>, [title] — просто отобразить информационное окошко сообщения с текстом message и заголовком title
  • exit, quit — завершить чат, но с запросом подтверждения
  • exit!, quit! — завершить чат без запроса
  • join <#room_name> — войти в комнату с названием #room_name
  • part [#room_name]   — выйти из текущей комнаты, но если указано имя комнаты, то выйти из той, указанной комнаты
  • connect — подключиться к серверу
  • disconnect — отключиться от сервера
  • nick <nickname> — установить себе новый ник nickname
  • registernick, register <пароль> <email> — зарегистрировать текущий ник, задать указанный пароль и email
  • chpasschangepass <old_password> <new_password> — поменять пароль текущего пользователя (ника). Нужно указать старый пароль и новый
  • regroomroomregister [#room_name] <password> — зарегистрировать комнату, задать ей пароль. Сработает тогда, когда регистрировать её будет пользователь, который её создал. Если не указать #room_name, то будет произведена попытка зарегистрировать текущую активную комнату, из которой эта команда была набрана
  • chroompasschangeroompass [#room_name] <old_password> <new_password> — сменить пароль комнаты. Это разрешено только владельцу комнаты. Если не указать #room_name, то будет использоваться текущая активная комната.
  • query <nickname> [reason] — позвать указанного пользователя в приват. Можно указать причину, тогда она отобразится у того пользователя при запросе на приват
  • msg <nickname> <message> — послать указанному пользователю приватное сообщение (из любой комнаты). Сработает только тогда, когда до этого был открыт приват с этим пользователем, но изначально оно работало и без запроса. Возможно, есть смысл вернуть это )
  • clear — очистить текущее окошко переписки
  • clear_history — очистить историю введённых сообщений и команд для текущего окошка
  • close — закрыть текущую вкладку комнаты или привата
  • echo <любой текст> — вывести в окошко переписки введённый текст

Вы, конечно, можете сказать: «Камон! Какой нафиг чат?! Сейчас 2018 год на дворе, соц-сети существуют, куча разных мессенджеров, зачем ещё что-то?!». А я вам скажу, что это было интересно делать, да и иметь свой собственный чат, в котором ты ни от кого не зависишь и можешь делать всё так, как нравится — это в любом случае круто! Да и всё же, с приходом разных этих мессенджеров и соц-сетей с кучей эмоджи и стикеров, а также голосовых сообщений и всего такого, мне кажется, немного потерялся этот особый дух текстовых сообщений (не знаю, как его правильно назвать). И конечно, я не агитирую за переход на этот чат, просто нашёл свой старый проект, снова его запустил, и даже используем тут с некоторыми людьми, но это не означает, что я против соц-сетей и других мессенджеров )
Просто это как-то помогает немного вернуть ту атмосферу, и нам это нравится 😉

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

Адрес: pc.karamush.ru
Порт:  25366
На текущий момент (на 08.07.018) пока всё ещё запущено и работает, в ближайшее время отключать не собираюсь.

[UPD 29.03.019]: из-за происков провайдера теперь нет возможности держать у себя сервер, т.к. не всегда выдаётся белый IP-адрес, так что скачивайте и пробуйте, всё прекрасно работает (из того, что уже сделано 🙂 ).

Единственный минус — всё это только под винду, написано на Delphi 7 с использованием некоторых дополнительных визуальных компонентов (всё будет в архиве). А сетевая часть использует библиотечку Synapse.

Кстати-кстати! Пока я этот чат писал тогда, в армии, я вёл текстовый документ с логом разработки develog.txtТуда я записывал свои мысли, эксперименты, текущий прогресс, результаты. В общем, когда сейчас вспомнил про этот чатик, решил всчитнуть этот девелог, и там так интересно было! Очень прикольное ощущение, когда читаешь то, что я там хотел сделать, а теперь оно всё есть и работает! А некоторые решения были не очень хорошими, поэтому об этом там тоже написано, и это убрано и не используется. В общем, довольно интересное чтиво. Криминальное 🙂

А вот и исходнички и отдельно бинарники!

Вот архив с клиентом и сервером, а также необходимыми для работы SSL библиотеками, которые нужно поместить в папку программы или в системную папку:
ichat_binaries.zip

А вот тут архив со всеми исходниками, develog-ом, а также необходимыми компонентами и либами (надеюсь, всё, что нужно, поместил):
ichat_sources.zip

А вот тут чисто клиентское приложение:
http://cdn.shpirat.net/exe/iChat.exe

[UPD 29.03.019]: по просьбе одного из пользователей сделал небольшую доработку, так что теперь можно просматривать список комнат не только в файловом менеджере, но из главного окошка, из меню «Комнаты->Список комнат». Так что теперь отдельное окошко со списком комнат, с отображением некоторой информации о них, с возможностью обновить этот список и войти в любую выбранную комнату )

Выглядит это вот так: 

Список комнат, оо да )

Скачать это обновление можно тут:
http://cdn.shpirat.net/zip/ichat_29.03.019_rooms_list.zip

Там просто обновлённые бинарники сервера и клиента, причём, сжатые UPX-ом зачем-то, для меньшего размера, хотя, в наше время быстрого интернета… Ну да ладно )

Надеюсь, было полезно и интересно! Если что, можете в комментариях писать, либо в ВК (если найдёте, хехе), если что-то вдруг будет не так или надо будет что-то добавить или исправить. )

Приятного использования! И не забывайте: сервер чата пока что запущен, так что можно опробовать 🙂

Вам также может понравиться

About the Author: karamush

3 комментария

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

    1. Для этого нужно либо порты открыть в своём роутере или что у вас там (при условии, что у вас есть белый IP, пусть и динамический).
      Ну либо взять в аренду VPS сервер на Windows и там запустить сервер чата. Тогда будет работать 🙂
      Увы, программа старая, и сервер можно запустить только на Windows системе. Хотя… может, через Wine получится и на линукс-сервере запустить…

Добавить комментарий для grimmi grimmi Отменить ответ

Войти с помощью: 

Ваш адрес email не будет опубликован. Обязательные поля помечены *