Update with translations
This commit is contained in:
423
README.md
423
README.md
@@ -1,184 +1,107 @@
|
||||
# 💬 **The Chat Room! v2.00** 💬
|
||||
|
||||
An IRC-style chat room built for **Reticulum NomadNet**, optimized for **MeshChat v2.1+**. Made By F.
|
||||
# The Chat Room! RU-Edition
|
||||
IRC-стиль чата для **Reticulum NomadNet**, оптимизирован для **MeshChat v2.1+**. Автор: F. Переведено на русский Sudo-Ivan.
|
||||
|
||||
---
|
||||
|
||||
## 🖼️ The Chat Room UI
|
||||
## Демо
|
||||
|
||||
Screenshot from MeshChat index.mu page interface:
|
||||
Официальная страница NomadNet:
|
||||
|
||||
<img width="1271" height="717" alt="index mu mod" src="https://github.com/user-attachments/assets/3f6d332a-c4e0-46f6-82ab-f9adb6090fd8" />
|
||||
**Ссылка на страницу NomadNet (оптимизировано для MeshChat v2.1+):** `d251bfd8e30540b5bd219bbbfcc3afc5:/page/index.mu`
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Live Demo
|
||||
## Информация
|
||||
|
||||
Experience the chatroom in action via the official NomadNet page:
|
||||
Добро пожаловать в **THE CHATROOM** – v2.00 от F.
|
||||
Первый IRC-стиль чата для Reticulum/Nomadnet, оптимизирован для Nomadnet и Meshchat v2.x+.
|
||||
|
||||
**NomadNet Page Link (MeshChat v2.1+ Optimized):** `d251bfd8e30540b5bd219bbbfcc3afc5:/page/index.mu`
|
||||
Создан в v1 (beta) 10 августа 2025.
|
||||
|
||||
Стабильная версия v2.00: 01/10/2025
|
||||
|
||||
---
|
||||
|
||||
# Informations
|
||||
## Обзор проекта
|
||||
|
||||
Welcome to **THE CHATROOM** – v2.00 by F.
|
||||
The first Reticulum/Nomadnet IRC-style chatroom, optimized for Nomadnet and Meshchat v2.x+.
|
||||
Скрипт страницы Nomadnet на Python для создания IRC-стиля чата.
|
||||
Скопируйте файлы из релиза GitHub в папку `./nomadnetwork/storage/pages/`,
|
||||
сделайте `nomadnet.mu` и `meshchat.mu` исполняемыми через `chmod +x` и запустите узел Nomadnet.
|
||||
|
||||
Born on v1 (beta) the 10 of August 2025. Enjoy!
|
||||
- Децентрализованная mesh-сеть на базе NomadNetwork
|
||||
- Регистрация не требуется — выберите никнейм и начинайте общаться
|
||||
- Никнеймы автоматически окрашиваются и сохраняются между сессиями
|
||||
- Привязка никнейма к адресу LXMF через Fingerprint в Meshchat v2+ для сохранения и восстановления никнейма между сессиями (благодарность: **THOMAS**)
|
||||
- Построен на Python и компонентах Micron, JSON и SQL БД для чата, темы и сохранения никнеймов
|
||||
- Официальный скрипт чата размещён на VPS для стабильной работы
|
||||
|
||||
Stable v2.00 update: 01/10/2025
|
||||
Демо: `d251bfd8e30540b5bd219bbbfcc3afc5:/page/index.mu`
|
||||
|
||||
GitHub: [https://github.com/fr33n0w/thechatroom](https://github.com/fr33n0w/thechatroom)
|
||||
|
||||
---
|
||||
|
||||
## Требования
|
||||
|
||||
# Table of Contents
|
||||
Проект использует встроенные модули Python и сторонние библиотеки.
|
||||
|
||||
1. [💬 The Chat Room! v2.00](#-the-chat-room-v200)
|
||||
- [🖼️ The Chat Room UI](#️-the-chat-room-ui)
|
||||
- [🚀 Live Demo](#-live-demo)
|
||||
### Встроенные модули (установка не требуется)
|
||||
|
||||
2. [📘 Informations](#informations)
|
||||
- [Project Overview](#-project-overview)
|
||||
| Модуль | Назначение |
|
||||
|---------------------|---------------------------------------------------------------------|
|
||||
| `os` | Работа с операционной системой (пути к файлам, переменные окружения)|
|
||||
| `sys` | Доступ к системным параметрам и функциям |
|
||||
| `json` | Парсинг и работа с JSON данными |
|
||||
| `time` | Операции со временем (задержки, временные метки) |
|
||||
| `random` | Генерация случайных значений |
|
||||
| `re` | Сопоставление с регулярными выражениями |
|
||||
| `shutil` | Высокоуровневые файловые операции (копирование, перемещение) |
|
||||
| `collections` | Специализированные структуры данных, например `Counter` |
|
||||
| `datetime` | Работа с датой и временем |
|
||||
|
||||
3. [🆘 Help Page](#-help-page)
|
||||
- [🧰 Requirements](#-requirements)
|
||||
- [✅ Built-in Modules](#-built-in-modules-no-installation-required)
|
||||
- [🌐 Third-Party Libraries](#-third-party-libraries-install-via-pip)
|
||||
### Сторонние библиотеки (установка через pip)
|
||||
|
||||
4. [⚙️ Installation](#️-installation)
|
||||
- [📁 1. Download the Files](#-1-download-the-files)
|
||||
- [📂 2. Copy Files to NomadNet Pages Directory](#-2-copy-files-to-nomadnet-pages-directory)
|
||||
- [🔓 3. Make Files Executable](#-3-make-nomadnetmu-meshchatmu-and-other-python-pages-executable)
|
||||
- [🚀 4. Launch NomadNet](#-4-launch-nomadnet)
|
||||
| Пакет | Назначение |
|
||||
|------------|---------------------------------------------------------------------|
|
||||
| `pytz` | Определения и преобразования часовых поясов |
|
||||
| `requests` | Упрощённые HTTP запросы (нужно только для команды /meteo) |
|
||||
| `geopy` | Геолокационные сервисы (поиск адресов через Nominatim) |
|
||||
| `sqlite3` | Локальное хранение SQLite БД для привязки никнейма к LXMF |
|
||||
|
||||
5. [⚙️ Technical Notes](#️-technical-notes)
|
||||
|
||||
6. [💬 Commands Reference](#-commands-reference)
|
||||
- [📘 General Info & Utility Commands](#-general-info--utility-commands)
|
||||
- [🧠 Interactive Chat Commands](#-interactive-chat-commands)
|
||||
- [🎭 Social Interaction Commands](#-social-interaction-commands)
|
||||
- [👤 User Status Commands](#-user-status-commands)
|
||||
- [🔒 Admin Commands](#-admin-commands-restricted-access)
|
||||
|
||||
7. [Other Features](#other-features)
|
||||
- [AntiSpam](#antispam)
|
||||
- [Fixed UI Windows](#fixed-ui-windows)
|
||||
- [NickName Color System](#nickname-color-system)
|
||||
- [Nickname & LXMF Fingerprint Binding](#nickname--lxmf-fingerprint-binding-thanks-to-thomas)
|
||||
- [Long Messages Split Function](#long-messages-split-function)
|
||||
- [Statistics and Users Commands](#statistics-and-users-commands)
|
||||
|
||||
8. [Next Work In Progress Features](#next-work-in-progress-features)
|
||||
- [Personalized User Settings](#personalized-user-settings)
|
||||
- [Administration Commands](#administration-commands)
|
||||
|
||||
9. [Screenshots](#screenshots)
|
||||
- [Screenshot from v1.45a](#screenshot-from-v145a)
|
||||
- [Screenshots from v2.0](#screenshots-from-v20)
|
||||
|
||||
---
|
||||
|
||||
|
||||
## 📘 Project Overview
|
||||
|
||||
This is a Python-based Nomadnet page script that creates a ready-to-run IRC-style chatroom.
|
||||
Just copy all files from this GitHub release into your `./nomadnetwork/storage/pages/` folder,
|
||||
make `nomadnet.mu` and `meshchat.mu`executable with `chmod +x`, and launch your Nomadnet node.
|
||||
|
||||
Detailed installation info below.
|
||||
|
||||
- 🌍 Decentralized mesh-based communication based on NomadNetwork
|
||||
- 🧑💻 No registration required—just choose a nickname and start chatting
|
||||
- 🎨 Nicknames are randomly colorized and persist across sessions (user settings personalization is coming soon!)
|
||||
- 🔒 Nickname to LXMF address binding, using the Fingerprint in Meshchat v2+ to save and recover the nickname across sessions
|
||||
(THANKS TO: **THOMAS**)
|
||||
- 🛠️ Built with Python and Micron components, JSON and SQL DBs for chat, topic and nickname persistency
|
||||
- 🌐 Official chat script is Hosted on a VPS for stable uptime
|
||||
|
||||
Live Demo: `d251bfd8e30540b5bd219bbbfcc3afc5:/page/index.mu`
|
||||
|
||||
Official GitHub: [https://github.com/fr33n0w/thechatroom](https://github.com/fr33n0w/thechatroom)
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
# 🆘 Help Page
|
||||
|
||||
Welcome to the Help section! This guide outlines all the modules required to run this project,
|
||||
|
||||
along with setup instructions to get you started smoothly.
|
||||
|
||||
## 🧰 Requirements
|
||||
|
||||
This project uses a combination of Python’s built-in modules and third-party libraries.
|
||||
|
||||
### ✅ Built-in Modules (No installation required)
|
||||
|
||||
These come bundled with Python and require no additional setup:
|
||||
|
||||
| Module | Purpose |
|
||||
|---------------------|-------------------------------------------------------------------------|
|
||||
| `os` | Interacts with the operating system (e.g., file paths, environment vars)|
|
||||
| `sys` | Accesses system-specific parameters and functions |
|
||||
| `json` | Parses and manipulates JSON data |
|
||||
| `time` | Handles time-based operations (e.g., delays, timestamps) |
|
||||
| `random` | Generates random values and selections |
|
||||
| `re` | Performs pattern matching with regular expressions |
|
||||
| `shutil` | Performs high-level file operations (e.g., copying, moving files) |
|
||||
| `collections` | Provides specialized data structures like `Counter` |
|
||||
| `datetime` | Manages date and time objects |
|
||||
|
||||
### 🌐 Third-Party Libraries (Install via pip)
|
||||
|
||||
These must be installed manually:
|
||||
|
||||
| Package | Purpose |
|
||||
|-------------|-------------------------------------------------------------------------|
|
||||
| `pytz` | Timezone definitions and conversions |
|
||||
| `requests` | Simplified HTTP requests and API calls (needed for /meteo command only) |
|
||||
| `geopy` | Geolocation services (e.g., address lookup via Nominatim, as above) |
|
||||
| `sqlite3` | Manages local SQLite database storage for Nickname to LXMF binding |
|
||||
|
||||
To install them, run:
|
||||
Установка:
|
||||
|
||||
```bash
|
||||
pip install pytz requests geopy sqlite3
|
||||
```
|
||||
|
||||
and of course, you need to install and configure NomadNet to host the page:
|
||||
Также необходимо установить и настроить NomadNet для размещения страницы:
|
||||
|
||||
```bash
|
||||
pip install nomadnet
|
||||
```
|
||||
|
||||
Tested and 100% working also with rns_server_pages by SebastianObi:
|
||||
Протестировано и работает с rns_server_pages от SebastianObi:
|
||||
https://github.com/SebastianObi/RNS-Tools/tree/main/rns_server_page
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Installation
|
||||
## Установка
|
||||
|
||||
Ready to deploy **THE CHATROOM** on your NomadNet node? Follow these steps to get it running in minutes:
|
||||
### 1. Скачать файлы
|
||||
|
||||
---
|
||||
|
||||
### 📁 1. Download the Files
|
||||
|
||||
Clone the repository or download the ZIP:
|
||||
Клонировать репозиторий или скачать ZIP:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/fr33n0w/thechatroom.git
|
||||
git clone https://github.com/Sudo-Ivan/thechatroom.git
|
||||
```
|
||||
|
||||
### 📂 2. Copy Files to NomadNet Pages Directory
|
||||
### 2. Скопировать файлы в директорию страниц NomadNet
|
||||
|
||||
```bash
|
||||
cp -r thechatroom/* ~/.nomadnetwork/storage/pages/
|
||||
|
||||
```
|
||||
|
||||
### 🔓 3. Make nomadnet.mu meshchat.mu and other python pages Executable
|
||||
### 3. Сделать файлы исполняемыми
|
||||
|
||||
```bash
|
||||
chmod +x ~/.nomadnetwork/storage/pages/nomadnet.mu
|
||||
@@ -186,163 +109,135 @@ chmod +x ~/.nomadnetwork/storage/pages/meshchat.mu
|
||||
chmod +x ~/.nomadnetwork/storage/pages/fullchat.mu
|
||||
chmod +x ~/.nomadnetwork/storage/pages/last100.mu
|
||||
```
|
||||
Also make sure your user has read and write permission for the json and db files to be correctly written and saved!
|
||||
|
||||
### 🚀 4. Launch NomadNet
|
||||
Install and configure Nomadnet (or other nomadnet hosting page servers), after configuration:
|
||||
Убедитесь, что у пользователя есть права на чтение и запись для JSON и DB файлов.
|
||||
|
||||
### 4. Запустить NomadNet
|
||||
|
||||
Установите и настройте Nomadnet (или другой сервер страниц nomadnet), после настройки:
|
||||
|
||||
```bash
|
||||
nomadnet
|
||||
```
|
||||
|
||||
# DONE!
|
||||
Готово!
|
||||
|
||||
Note: TheChatRoom has been created and run on root user machines, probably you need to be root to run it, let me know if you encounter some difficulties!
|
||||
Примечание: TheChatRoom создан и запускался на машинах с правами root, возможно потребуются права root для запуска.
|
||||
|
||||
LXMF Contact: 0d051f3b6f844380c3e0c5d14e37fac8
|
||||
---
|
||||
LXMF Контакт: 0d051f3b6f844380c3e0c5d14e37fac8
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Technical Notes
|
||||
## Технические заметки
|
||||
|
||||
Here are some important details about how **THE CHATROOM** works and what to expect:
|
||||
|
||||
- 🔄 The chatroom does **not auto-refresh** due to Micron limitations
|
||||
→ Use the **Reload buttons** that you find in the bottom menubar to view new messages
|
||||
- 🧠 Nicknames can be stored using MeshChat’s **Fingerprint binding**
|
||||
- Usage: press fingerprint button, set a nickname and reload the page. Nick is saved.
|
||||
→ This allows nickname persistence across sessions (thanks to Thomas!)
|
||||
- To recover the nickname on lost session cache, press fingerprint again and it will reappear automatically
|
||||
- 📜 The main chat view shows the **last 30 messages** to fit MeshChat browser windows, you cn adjust the limit in the script
|
||||
→ Full logs are available via the **View Logs** button on the bottom menù
|
||||
- 🧪 The `/meteo` command uses external APIs
|
||||
→ Requires `requests` and `geopy` to be installed
|
||||
- 🧱 Built with Python and Micron components
|
||||
→ Compatible with MeshChat v2.1+ and pure NomadNet client!
|
||||
- 🧪 More Features will come soon! Stay Tuned!
|
||||
- Чат не обновляется автоматически из-за ограничений Micron
|
||||
→ Используйте кнопки **Reload** в нижней панели меню для просмотра новых сообщений
|
||||
- Никнеймы можно сохранять через **Fingerprint binding** в MeshChat
|
||||
- Использование: нажмите кнопку fingerprint, установите никнейм и перезагрузите страницу. Никнейм сохранён.
|
||||
→ Это позволяет сохранять никнейм между сессиями (благодарность Thomas!)
|
||||
- Для восстановления никнейма при потере кэша сессии нажмите fingerprint снова, и он появится автоматически
|
||||
- Основной вид чата показывает **последние 30 сообщений** для соответствия окнам браузера MeshChat, можно настроить лимит в скрипте
|
||||
→ Полные логи доступны через кнопку **View Logs** в нижнем меню
|
||||
- Команда `/meteo` использует внешние API
|
||||
→ Требует установки `requests` и `geopy`
|
||||
- Построен на Python и компонентах Micron
|
||||
→ Совместим с MeshChat v2.1+ и чистым клиентом NomadNet
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
## Справочник команд
|
||||
|
||||
## 💬 Commands Reference
|
||||
### Общие информационные и служебные команды
|
||||
|
||||
Here’s the full list of available commands in **THE CHATROOM**, grouped by category for easy reference:
|
||||
| Команда | Описание |
|
||||
|------------|----------------------------------------------------|
|
||||
| `/info` | Показать информацию о чате, использование и отказ |
|
||||
| `/cmd` | Показать все доступные команды пользователя |
|
||||
| `/stats` | Показать статистику чата, включая Топ-5 участников |
|
||||
| `/users` | Список всех активных пользователей чата |
|
||||
| `/version` | Показать версию скрипта, последние обновления |
|
||||
|
||||
### Интерактивные команды чата
|
||||
|
||||
| Команда | Описание |
|
||||
|-----------------------------|---------------------------------------------------|
|
||||
| `/lastseen <nickname>` | Показать последнее появление и сообщение пользователя |
|
||||
| `/topic` или `/topic <text>` | Просмотр или изменение текущей темы комнаты |
|
||||
| `/search <keyword(s)>` | Поиск ключевых слов в полном логе чата |
|
||||
| `/time` | Показать текущее время сервера (UTC) и локальное |
|
||||
| `/ping` | Ответить PONG! для подтверждения активности системы |
|
||||
| `/meteo <city>` | Получить информацию о погоде для города (требует интернет + API) |
|
||||
|
||||
### Команды социального взаимодействия
|
||||
|
||||
| Команда | Описание |
|
||||
|-----------------------------|---------------------------------------------------|
|
||||
| `/e` | Отправить случайные эмодзи из внутреннего списка |
|
||||
| `/c <message>` | Отправить цветное сообщение со случайными цветами фона и шрифта |
|
||||
| `@nickname` | Упомянуть пользователя с цветной подсветкой |
|
||||
| `$e` | Вставить случайный эмотикон в любое место сообщения |
|
||||
| `/welcome` или `/welcome <nickname>` | Отправить приветственное сообщение в комнату или конкретному пользователю |
|
||||
|
||||
### Команды статуса пользователя
|
||||
|
||||
| Команда | Описание |
|
||||
|-----------------------------|---------------------------------------------------|
|
||||
| `/hi`, `/bye`, `/brb`, `/lol`, `/exit`, `/quit`, `/away`, `/back`, `/notice` | Отправить обновления статуса или реакции |
|
||||
| Пример | `/hi Hello World!` — синтаксис работает для всех команд статуса |
|
||||
|
||||
### Административные команды (ограниченный доступ)
|
||||
|
||||
> Доступны только системным администраторам через `/admincmd`
|
||||
|
||||
| Команда | Описание |
|
||||
|--------------------------|---------------------------------------------------|
|
||||
| `/clear` | Удалить последнее сообщение навсегда |
|
||||
| `/clear N` | Удалить последние N сообщений, например `/clear 3` |
|
||||
| `/clear user <nickname>` | Удалить все сообщения от конкретного пользователя |
|
||||
| `/clearall` | Очистить весь лог чата и базу данных (необратимо) |
|
||||
| `/backup` | Создать полную резервную копию `chat_log.json` в папке скрипта |
|
||||
|
||||
> Некоторые команды требуют доступа в интернет или сторонних библиотек (`requests`, `geopy`).
|
||||
> Административные команды защищены и доступны только авторизованным пользователям. (Отредактируйте никнейм SYSADMIN в скрипте!!)
|
||||
|
||||
---
|
||||
|
||||
### 📘 General Info & Utility Commands
|
||||
## Дополнительные возможности
|
||||
|
||||
| Command | Description |
|
||||
|-------------------|-----------------------------------------------------------------------------|
|
||||
| `/info` | Show chatroom information, usage, and disclaimer |
|
||||
| `/cmd` | Display all available user commands |
|
||||
| `/stats` | Show chatroom statistics, including Top 5 Chatters |
|
||||
| `/users` | List all active chatroom users |
|
||||
| `/version` | Show script version, latest updates, and news |
|
||||
### Антиспам
|
||||
|
||||
The ChatRoom! включает список фильтров антиспама на основе отдельных слов или комбинаций фраз. Добавьте свои или удалите ненужные заблокированные слова в секции spam_patterns скрипта.
|
||||
|
||||
### Фиксированные окна интерфейса
|
||||
|
||||
Интерфейс фиксирован с помощью переменной DISPLAY_LIMIT, ограничен примерно 28 сообщениями для соответствия окну браузера MeshChat 2.0+.
|
||||
То же для страницы Nomadnet с более простым подходом, ограничение строк примерно до 36.
|
||||
Примечание: Длинные сообщения пользователей разбиваются на несколько строк, что может изменять размер финального интерфейса.
|
||||
|
||||
### Система цветов никнеймов
|
||||
|
||||
Автоматическое окрашивание никнейма пользователя для лучшей читаемости, сохраняется для любого сообщения или команды, один никнейм — один цвет. Можно редактировать цвета по умолчанию в скрипте.
|
||||
|
||||
### Привязка никнейма к отпечатку LXMF (благодарность Thomas!)
|
||||
|
||||
Нажав кнопку Fingerprint в meshchat v2.1+, вы отправляете свой lxmf в чат, и скрипт автоматически привяжет никнейм и адрес lxmf как автовход. При повторном входе в чат никнейм будет автоматически восстановлен. Если переменные окружения meshchat отсутствуют (например, после перезагрузки), просто нажмите fingerprint снова, и на основе вашего lxmf никнейм появится автоматически. Никнейм и соответствующий адрес LXMF сохраняются в SQL БД для восстановления.
|
||||
|
||||
### Функция разбиения длинных сообщений
|
||||
|
||||
Длинные сообщения автоматически разбиваются на несколько строк для сохранения постоянного макета и формата интерфейса.
|
||||
|
||||
### Команды статистики и пользователей
|
||||
|
||||
Показывают статистику чата, топ участников, общее количество отправленных сообщений на пользователя, общее количество пользователей в чате (команды: /stats или /users)
|
||||
|
||||
---
|
||||
|
||||
### 🧠 Interactive Chat Commands
|
||||
## Планируемые функции
|
||||
|
||||
| Command | Description |
|
||||
|-----------------------------|-----------------------------------------------------------------------------|
|
||||
| `/lastseen <nickname>` | Show last seen info and latest message from a user |
|
||||
| `/topic` or `/topic <text>` | View or change the current room topic |
|
||||
| `/search <keyword(s)>` | Search for keywords in the full chat log |
|
||||
| `/time` | Show current server time (UTC) and your local time |
|
||||
| `/ping` | Reply with PONG! to confirm chat system is active |
|
||||
| `/meteo <city>` | Get weather info for a city (requires internet + API) |
|
||||
### Персонализированные настройки пользователя
|
||||
|
||||
---
|
||||
(например, установка предпочтений цвета никнейма, возможность кликнуть по никнейму для отправки адреса lxmf для приватного чата, удаление привязки никнейма и lxmf, выбор темы чата и т.д.)
|
||||
|
||||
### 🎭 Social Interaction Commands
|
||||
### Команды администрирования
|
||||
|
||||
| Command | Description |
|
||||
|-----------------------------|-----------------------------------------------------------------------------|
|
||||
| `/e` | Send randomized emojis from the internal emoji list |
|
||||
| `/c <message>` | Send a colored message with randomized background and font colors |
|
||||
| `@nickname` | Mention a user with a colored highlight |
|
||||
| `$e` | Insert a random emoticon anywhere in your message |
|
||||
| `/welcome` or `/welcome <nickname>` | Send a welcome message to the room or a specific user |
|
||||
|
||||
---
|
||||
|
||||
### 👤 User Status Commands
|
||||
|
||||
| Command | Description |
|
||||
|-----------------------------|-----------------------------------------------------------------------------|
|
||||
| `/hi`, `/bye`, `/brb`, `/lol`, `/exit`, `/quit`, `/away`, `/back`, `/notice` | Send status updates or reactions |
|
||||
| Example | `/hi Hello World!` — syntax works for all status commands |
|
||||
|
||||
---
|
||||
|
||||
### 🔒 Admin Commands (Restricted Access)
|
||||
|
||||
> Only available to system administrators via `/admincmd`
|
||||
|
||||
| Command | Description |
|
||||
|----------------------------------|-------------------------------------------------------------------------|
|
||||
| `/clear` | Delete the last message permanently |
|
||||
| `/clear N` | Delete the last N messages, e.g. `/clear 3` |
|
||||
| `/clear user <nickname>` | Delete all messages from a specific user |
|
||||
| `/clearall` | Clear the entire chat log and database (irreversible) |
|
||||
| `/backup` | Create a full `chat_log.json` backup in the script folder |
|
||||
|
||||
---
|
||||
|
||||
> ⚠️ Some commands require internet access or third-party libraries (`requests`, `geopy`).
|
||||
> 🔐 Admin commands are protected and only executable by authorized users. (Edit SYSADMIN nickname in the script!!)
|
||||
|
||||
---
|
||||
|
||||
## Other Features:
|
||||
|
||||
### AntiSpam
|
||||
|
||||
The ChatRoom! includes already a good list of antispam filters, based on single words or combined phrases. Add your own or remove the unwanted blocked words to make it less strict in spam_patterns lines section of the script.
|
||||
|
||||
## Fixed UI Windows
|
||||
The UI is fixed in place with DISPLAY_LIMIT var, limited to ~28 messages to fit the MeshChat 2.0+ Browser window.
|
||||
Same for the Nomadnet page with simpler approach to limit lines to ~36
|
||||
Note: Long user messages are split into multiple lines and it can vary the size of the final rendered UI.
|
||||
|
||||
## NickName Color System
|
||||
Automatically color the user nickname for better readability, keeps it persistant for any message or command, same nick, same color, you can edit the default colors in the script.
|
||||
|
||||
## Nickname & LXMF fingerprint binding (Thanks to Thomas!)
|
||||
Pressing the Fingerprint button on meshchat v2.1+ , you send your lxmf to the chat and the script will automatically bind the nickname and the lxmf address like a sort of autologin. on rejoining the chat, nickname will be automatically recovered. if the meshchat os variables are missing (in case of reboot for example), just press fingerprint again and based on your lxmf, your nickname will reappear again automatically. Nickname and corresponding LXMF address is saved in a sql db to be recovered.
|
||||
|
||||
## Long messages split function
|
||||
On longer messages, they will automatically be split in multiple lines to keep persistant ui layout and format.
|
||||
|
||||
## Statistics and users commands
|
||||
Show chat statistics, top chatters, total sent message per user, total users in chat (commands: /stats or /users)
|
||||
|
||||
|
||||
---
|
||||
|
||||
## Next Work In Progress Features:
|
||||
|
||||
### Personalized User Settings
|
||||
(eg. set your nickname color preferences, possibility to click nickname to share your lxmf address for private chat, remove your nick and lxmf binding, chat theme selection, ecc.)
|
||||
|
||||
### Administration Commands
|
||||
(eg. Add or Remove multiple Administrators)
|
||||
|
||||
---
|
||||
|
||||
# Screenshot from v1.45a:
|
||||
|
||||
<img width="1316" height="851" alt="the chat room" src="https://github.com/user-attachments/assets/371dbcc7-16df-4420-bee8-ec546e3ade3d" />
|
||||
|
||||
# Screenshots from v2.0:
|
||||
|
||||
Index.mu Intro page for interface selection:
|
||||
<img width="1309" height="991" alt="index" src="https://github.com/user-attachments/assets/3ff32000-af9c-4d86-8f28-7458576e2e21" />
|
||||
|
||||
Meshchat >v2.0+ UI Interface:
|
||||
<img width="1308" height="926" alt="meshchat" src="https://github.com/user-attachments/assets/656a607a-4b40-46cc-9103-118824d42a74" />
|
||||
|
||||
NomadNet UI Interface:
|
||||
<img width="1493" height="899" alt="nomadnet" src="https://github.com/user-attachments/assets/51c7eb2c-e238-4c55-9bae-3ae39ced6073" />
|
||||
(например, добавление или удаление нескольких администраторов)
|
||||
|
||||
14
fullchat.mu
14
fullchat.mu
@@ -1,18 +1,18 @@
|
||||
#!/usr/bin/env python3
|
||||
import os, json
|
||||
|
||||
# 📂 Message log
|
||||
# Лог сообщений
|
||||
log_file = os.path.join(os.path.dirname(__file__), "chat_log.json")
|
||||
debug = []
|
||||
try:
|
||||
with open(log_file, "r") as f:
|
||||
log = json.load(f)
|
||||
debug.append(f" Total {len(log)} messages loaded.")
|
||||
debug.append(f"Загружено сообщений: {len(log)}")
|
||||
except Exception as e:
|
||||
log = []
|
||||
debug.append(f"Failed to load log: {e}")
|
||||
debug.append(f"Ошибка загрузки лога: {e}")
|
||||
|
||||
# 🎨 Colors
|
||||
# Цвета
|
||||
colors = [
|
||||
"B900", "B090", "B009", "B099", "B909", "B066", "B933", "B336", "B939",
|
||||
"B660", "B030", "B630", "B363", "B393", "B606", "B060", "B003", "B960", "B999",
|
||||
@@ -22,13 +22,13 @@ colors = [
|
||||
def get_color(name):
|
||||
return colors[sum(ord(c) for c in name.lower()) % len(colors)]
|
||||
|
||||
# 🧾 Build Full Log UI
|
||||
template = "> 📜 FULL CHAT LOG - Displaying all chat messages - Reload to update - Press Back to return to The Chat Room!\n\n"
|
||||
# Построение интерфейса полного лога
|
||||
template = "> ПОЛНЫЙ ЛОГ ЧАТА - Отображаются все сообщения чата - Перезагрузите для обновления - Нажмите Назад для возврата в Чат!\n\n"
|
||||
for msg in log:
|
||||
color = get_color(msg["user"])
|
||||
template += f"[{msg['time']} `{color}` `!` `*` <{msg['user']}>`b `!` `*` {msg['text']}\n"
|
||||
|
||||
template += f"\n>`B777`Faaa` Total Messages: {len(log)}`b`F"
|
||||
template += f"\n>`B777`Faaa` Всего сообщений: {len(log)}`b`F"
|
||||
for line in debug:
|
||||
template += f"\n>`B888` {line}`b"
|
||||
|
||||
|
||||
40
index.mu
40
index.mu
@@ -1,33 +1,30 @@
|
||||
`c
|
||||
|
||||
-
|
||||
`Faff Welcome To:
|
||||
`Faff Добро пожаловать в:
|
||||
|
||||
`F0ff`B52f
|
||||
|
||||
|
||||
|
||||
▗▄▄▄▖▗▖ ▄▄ ▗▖ ▗▄▄▖ ▄▄▖ ▗▄▖
|
||||
▝▀█▀▘▐▌ █▀▀▌▐▌ ▐▌ ▐▛▀▜▌ ▐▀▀█▖ █▀█
|
||||
█ ▐▙██▖ ▟█▙ ▐▛ ▐▙██▖ ▟██▖▐███ ▐▌ ▐▌ ▟█▙ ▟█▙ ▐█▙█▖ ▐▙ ▟▌ ▐▌ ▐▌ ▐▌
|
||||
█ ▐▛ ▐▌▐▙▄▟▌ ▐▌ ▐▛ ▐▌ ▘▄▟▌ ▐▌ ▐███ ▐▛ ▜▌▐▛ ▜▌▐▌█▐▌ █ █ ▗▛ ▐▌█▐▌
|
||||
█ ▐▌ ▐▌▐▛▀▀▘ ▐▙ ▐▌ ▐▌▗█▀▜▌ ▐▌ ▐▌▝█▖▐▌ ▐▌▐▌ ▐▌▐▌█▐▌ ▜▄▛ ▗▛ ▐▌ ▐▌
|
||||
█ ▐▌ ▐▌▝█▄▄▌ █▄▄▌▐▌ ▐▌▐▙▄█▌ ▐▙▄ ▐▌ ▐▌▝█▄█▘▝█▄█▘▐▌█▐▌ ▐█▌ ▗█▄▄▖ █ █▄█
|
||||
▀ ▝▘ ▝▘ ▝▀▀ ▀▀ ▝▘ ▝▘ ▀▀▝▘ ▀▀ ▝▘ ▝▀ ▝▀▘ ▝▀▘ ▝▘▀▝▘ ▀ ▝▀▀▀▘ ▀ ▝▀▘
|
||||
|
||||
`F0ff`
|
||||
|
||||
▄▄▄▄▄▄ ▄▄ ▄▄ ▄▄▄▄ ▄▄
|
||||
██▀▀▀▀██ ██ ██ ██▀▀▀▀█ ██ ██
|
||||
██ ██ ██ ██ ██▀ ██▄████▄ ▄█████▄ ███████
|
||||
███████ ██ ██ ██ ██▀ ██ ▀ ▄▄▄██ ██
|
||||
██ ▀██▄ ██ ██ ██▄ ██ ██ ▄██▀▀▀██ ██
|
||||
██ ██ ▀██▄▄██▀ ██▄▄▄▄█ ██ ██ ██▄▄▄███ ██▄▄▄
|
||||
▀▀ ▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀ ▀▀ ▀▀▀▀ ▀▀ ▀▀▀▀
|
||||
|
||||
|
||||
`f`b
|
||||
|
||||
|
||||
-
|
||||
|
||||
`Ff59
|
||||
|
||||
`!`B000┏━┓┏━╸╻ ┏━╸┏━╸╺┳╸ ╻ ╻┏━┓┏━╸┏━┓ ╻┏┓╻╺┳╸┏━╸┏━┓┏━╸┏━┓┏━╸┏━╸ `b`!
|
||||
`!`B000┗━┓┣╸ ┃ ┣╸ ┃ ┃ ┃ ┃┗━┓┣╸ ┣┳┛ ┃┃┗┫ ┃ ┣╸ ┣┳┛┣╸ ┣━┫┃ ┣╸ ╹`b`!
|
||||
`!`Bfff┗━┛┗━╸┗━╸┗━╸┗━╸ ╹ ┗━┛┗━┛┗━╸╹┗╸ ╹╹ ╹ ╹ ┗━╸╹┗╸╹ ╹ ╹┗━╸┗━╸╹`b`!
|
||||
`!`B000┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓`b`!
|
||||
`!`B000┃ ВЫБЕРИТЕ ИНТЕРФЕЙС ┃`b`!
|
||||
`!`B000┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛`b`!
|
||||
|
||||
|
||||
`Bfff`F000 `! `_`[ •‣ NOMADNET INTERFACE`:/page/nomadnet.mu]`_` `_`[ •‣ MESHcHAT 2+ IRC-STYLE INTERFACE`:/page/meshchat.mu]`_` `!`b
|
||||
`Bfff`F000`!`_`[•‣ NomadNet`:/page/nomadnet.mu]`_` `_`[ •‣ MeshChat`:/page/meshchat.mu]`_` `!`b
|
||||
|
||||
|
||||
|
||||
@@ -35,4 +32,7 @@
|
||||
|
||||
|
||||
|
||||
`Bfff`F000 Get THE CHATROOM on GitHub: https://github.com/fr33n0w/thechatroom `b
|
||||
|
||||
|
||||
|
||||
`Bfff`F000 Исходный код на GitHub: https://github.com/fr33n0w/thechatroom `b
|
||||
|
||||
18
last100.mu
18
last100.mu
@@ -1,22 +1,22 @@
|
||||
#!/usr/bin/env python3
|
||||
import os, json
|
||||
|
||||
# ?? Message log
|
||||
# Лог сообщений
|
||||
log_file = os.path.join(os.path.dirname(__file__), "chat_log.json")
|
||||
debug = []
|
||||
try:
|
||||
with open(log_file, "r") as f:
|
||||
log = json.load(f)
|
||||
debug.append(f"Total {len(log)} messages loaded.")
|
||||
debug.append(f"Загружено сообщений: {len(log)}")
|
||||
except Exception as e:
|
||||
log = []
|
||||
debug.append(f"Failed to load log: {e}")
|
||||
debug.append(f"Ошибка загрузки лога: {e}")
|
||||
|
||||
# Show only the last 100 messages
|
||||
# Показать только последние 100 сообщений
|
||||
log = log[-100:] if len(log) > 100 else log
|
||||
debug.append(f"Displaying last {len(log)} messages.")
|
||||
debug.append(f"Отображается последних сообщений: {len(log)}")
|
||||
|
||||
# ?? Colors
|
||||
# Цвета
|
||||
colors = [
|
||||
"B900", "B090", "B009", "B099", "B909", "B066", "B933", "B336", "B939",
|
||||
"B660", "B030", "B630", "B363", "B393", "B606", "B060", "B003", "B960", "B999",
|
||||
@@ -26,13 +26,13 @@ colors = [
|
||||
def get_color(name):
|
||||
return colors[sum(ord(c) for c in name.lower()) % len(colors)]
|
||||
|
||||
# ?? Build Partial Log UI
|
||||
template = "> ?? RECENT CHAT LOG - Showing last 100 messages - Reload to update - Press Back to return to The Chat Room!\n\n"
|
||||
# Построение интерфейса частичного лога
|
||||
template = "> НЕДАВНИЙ ЛОГ ЧАТА - Показываются последние 100 сообщений - Перезагрузите для обновления - Нажмите Назад для возврата в Чат!\n\n"
|
||||
for msg in log:
|
||||
color = get_color(msg["user"])
|
||||
template += f"[{msg['time']} `{color}` `!` `*` <{msg['user']}>`b `!` `*` {msg['text']}\n"
|
||||
|
||||
template += f"\n>`B777`Faaa` Displayed Messages: {len(log)}`b`F"
|
||||
template += f"\n>`B777`Faaa` Отображено сообщений: {len(log)}`b`F"
|
||||
for line in debug:
|
||||
template += f"\n>`B888` {line}`b"
|
||||
|
||||
|
||||
260
meshchat.mu
260
meshchat.mu
@@ -1,32 +1,18 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
#!c=0
|
||||
# ^^^^ <--> Nomadnet specific to prevent page caching, may change if you like.
|
||||
|
||||
###################################################################################################################################
|
||||
## Welcome To: THE CHATROOM! - v2.00 by F. - The First Reticulum / Nomadnet IRC-STYLE Chat - Nomadnet & Meshchat compatible! ##
|
||||
## ##
|
||||
## ##
|
||||
## Full info on the official GitHub ReadMe: https://github.com/fr33n0w/thechatroom ##
|
||||
## ##
|
||||
## Come To Visit and Join The Original ChatRoom Nomadnet to see it in action: ##
|
||||
## NomadNet Link: d251bfd8e30540b5bd219bbbfcc3afc5:/page/index.mu ##
|
||||
## ##
|
||||
## ##
|
||||
## THIS NOMADNET PAGE PYTHON SCRIPT IS FREE AND OPEN SOURCE, PLEASE KEEP ORIGINAL LINKS INSIDE TO SUPPORT THE DEVELOPER'S WORK! ##
|
||||
################################################### ENJOY YOUR NEW CHATROOM! ######################################################
|
||||
|
||||
######## IMPORT MODULES: ########
|
||||
######## ИМПОРТ МОДУЛЕЙ: ########
|
||||
import os, sys, json, time, random, re, sqlite3
|
||||
|
||||
######## INITIALIZE LOG (LOCAL SYSTEM INFO MESSAGES) #####
|
||||
######## ИНИЦИАЛИЗАЦИЯ ЛОГА (ЛОКАЛЬНЫЕ СИСТЕМНЫЕ ИНФОРМАЦИОННЫЕ СООБЩЕНИЯ) #####
|
||||
log = []
|
||||
|
||||
######## SYS & FILE PATHS ########
|
||||
######## СИСТЕМНЫЕ И ФАЙЛОВЫЕ ПУТИ ########
|
||||
DB_PATH = os.path.join(os.path.dirname(__file__), "chatusers.db")
|
||||
EMO_DB = os.path.join(os.path.dirname(__file__), "emoticons.txt")
|
||||
|
||||
######## DB CREATION IF MISSING (on first start usually) ######
|
||||
######## СОЗДАНИЕ БД ЕСЛИ ОТСУТСТВУЕТ (обычно при первом запуске) ######
|
||||
if not os.path.exists(DB_PATH):
|
||||
conn = sqlite3.connect(DB_PATH)
|
||||
cursor = conn.cursor()
|
||||
@@ -41,15 +27,15 @@ if not os.path.exists(DB_PATH):
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
######## DISPLAY LIMIT SETTINGS: ######## (Keeps UI fixed in the meshchat browser)
|
||||
MAX_CHARS = 103 # Adjust as needed to split messages after N chars
|
||||
MAX_LINES = 28 # Max lines on screen
|
||||
######## НАСТРОЙКИ ЛИМИТА ОТОБРАЖЕНИЯ: ######## (Сохраняет интерфейс фиксированным в браузере meshchat)
|
||||
MAX_CHARS = 103 # Настройте по необходимости для разбиения сообщений после N символов
|
||||
MAX_LINES = 28 # Максимум строк на экране
|
||||
|
||||
######## MASTER SYSADMIN SETTINGS ######## (USE COMPLEX NICKNAMES FOR THE SYSADMINS!)
|
||||
SYSADMIN = "setyouradminlongnamehere" # SET YOUR MASTER ADMIN NICKNAME FOR CHAT ADMIN COMMANDS
|
||||
######## НАСТРОЙКИ ГЛАВНОГО СИСТЕМНОГО АДМИНИСТРАТОРА ######## (ИСПОЛЬЗУЙТЕ СЛОЖНЫЕ НИКНЕЙМЫ ДЛЯ СИСТЕМНЫХ АДМИНИСТРАТОРОВ!)
|
||||
SYSADMIN = "setyouradminlongnamehere" # УСТАНОВИТЕ ВАШ НИКНЕЙМ ГЛАВНОГО АДМИНИСТРАТОРА ДЛЯ АДМИНИСТРАТИВНЫХ КОМАНД ЧАТА
|
||||
|
||||
|
||||
######## UI Unicode Emojis: ########
|
||||
######## ЭМОДЗИ ИНТЕРФЕЙСА UNICODE: ########
|
||||
user_icon = "\U0001F464" # "\U0001F464" # "\U0001F465" - "\U0001FAAA"
|
||||
message_icon = "\U0001F4AC"
|
||||
msg2_icon = "\u2709\ufe0f"
|
||||
@@ -62,7 +48,7 @@ nickset_icon = "\U0001F504"
|
||||
info_icon = "\u1F6C8"
|
||||
stats_icon = "\u1F4DD"
|
||||
|
||||
######## Antispam filters: ######## (Add or remove what you want to allow or not)
|
||||
######## Фильтры антиспама: ######## (Добавьте или удалите то, что хотите разрешить или запретить)
|
||||
spam_patterns = [
|
||||
r"buy\s+now",
|
||||
r"free\s+money",
|
||||
@@ -146,13 +132,13 @@ spam_patterns = [
|
||||
|
||||
]
|
||||
|
||||
################### Nickname Auto-Color System ##################### (Change colors if you want)
|
||||
################### Система автоматической окраски никнеймов ##################### (Измените цвета если хотите)
|
||||
colors = [ "B900", "B090", "B009", "B099", "B909", "B066", "B933", "B336", "B939", "B660", "B030", "B630", "B363", "B393", "B606", "B060", "B003", "B960", "B999", "B822", "B525", "B255", "B729", "B279", "B297", "B972", "B792", "B227", "B277", "B377", "B773", "B737", "B003", "B111", "B555", "B222", "B088", "B808", "B180" ]
|
||||
def get_color(name):
|
||||
return colors[sum(ord(c) for c in name.lower()) % len(colors)]
|
||||
|
||||
|
||||
######### Recover input from Os Environment variables ########
|
||||
######### Восстановление ввода из переменных окружения ОС ########
|
||||
def recover_input(key_suffix):
|
||||
for k, v in os.environ.items():
|
||||
if k.lower().endswith(key_suffix):
|
||||
@@ -165,7 +151,7 @@ remote_identity = recover_input("remote_identity")
|
||||
nickname = recover_input("field_username") # This is prioritized
|
||||
dest = recover_input("dest")
|
||||
|
||||
# Fallback to command-line arguments if needed
|
||||
# Резервный вариант: аргументы командной строки при необходимости
|
||||
if not raw_username and len(sys.argv) > 1:
|
||||
raw_username = sys.argv[1].strip()
|
||||
if not message and len(sys.argv) > 2:
|
||||
@@ -173,11 +159,11 @@ if not message and len(sys.argv) > 2:
|
||||
if not dest and len(sys.argv) > 3:
|
||||
dest = sys.argv[3].strip()
|
||||
|
||||
# Extract hash code from remote identity and LXMF address
|
||||
# Извлечение хэш-кода из удалённой идентичности и адреса LXMF
|
||||
hash_code = remote_identity[-4:] if remote_identity else ""
|
||||
dest_code = dest[-4:] if dest else ""
|
||||
|
||||
# Smart fallback for display name with logging
|
||||
# Умный резервный вариант для отображаемого имени с логированием
|
||||
if nickname:
|
||||
display_name = nickname
|
||||
elif dest:
|
||||
@@ -185,7 +171,7 @@ elif dest:
|
||||
else:
|
||||
display_name = "Guest"
|
||||
|
||||
# sql db nick binding and recovering
|
||||
# Привязка никнейма к SQL БД и восстановление
|
||||
|
||||
def init_db():
|
||||
conn = sqlite3.connect(DB_PATH)
|
||||
@@ -237,7 +223,7 @@ remote_identity = os.getenv("remote_identity", "").strip()
|
||||
# Try to load display_name from DB
|
||||
db_display_name = get_display_name_from_db(dest)
|
||||
|
||||
# Determine final display_name with logging
|
||||
# Определение финального display_name с логированием
|
||||
nickname_recovered_from_db = False
|
||||
|
||||
if nickname:
|
||||
@@ -245,7 +231,7 @@ if nickname:
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
"text": f"`!` Nickname recovered from environment: {display_name} `!`"
|
||||
"text": f"`!` Никнейм восстановлен из окружения: {display_name} `!`"
|
||||
})
|
||||
elif db_display_name:
|
||||
display_name = db_display_name
|
||||
@@ -253,24 +239,24 @@ elif db_display_name:
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
"text": f"`!` Nickname recovered from database: {display_name} `!`"
|
||||
"text": f"`!` Никнейм восстановлен из базы данных: {display_name} `!`"
|
||||
})
|
||||
elif dest:
|
||||
display_name = f"Guest_{dest[-4:]}"
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
"text": f"`!` No nickname found. Using fingerprint: {display_name} `!`"
|
||||
"text": f"`!` Никнейм не найден. Используется отпечаток: {display_name} `!`"
|
||||
})
|
||||
else:
|
||||
display_name = "Guest"
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
"text": "`!` No nickname or fingerprint found. Defaulting to Guest `!`"
|
||||
"text": "`!` Никнейм или отпечаток не найдены. Используется по умолчанию: Guest `!`"
|
||||
})
|
||||
|
||||
# Save user to DB if valid
|
||||
# Сохранение пользователя в БД если валидно
|
||||
save_user_to_db(remote_identity, dest, display_name)
|
||||
|
||||
# -----------------------------------------------
|
||||
@@ -286,15 +272,15 @@ safe_username = (
|
||||
.replace("$", "").replace(" ", "").strip() or "Guest"
|
||||
)
|
||||
|
||||
# Chat Topic functions
|
||||
# Функции темы чата
|
||||
topic_file = os.path.join(os.path.dirname(__file__), "topic.json")
|
||||
try:
|
||||
with open(topic_file, "r") as tf:
|
||||
topic_data = json.load(tf)
|
||||
topic_text = topic_data.get("text", "Welcome to the chatroom!")
|
||||
topic_text = topic_data.get("text", "Добро пожаловать в чат!")
|
||||
topic_author = topic_data.get("user", "System")
|
||||
except:
|
||||
topic_text = "Welcome to the chatroom!"
|
||||
topic_text = "Добро пожаловать в чат!"
|
||||
topic_author = "System"
|
||||
|
||||
|
||||
@@ -304,16 +290,16 @@ debug = []
|
||||
try:
|
||||
with open(log_file, "r") as f:
|
||||
log = json.load(f)
|
||||
debug.append(f" Total {len(log)} messages")
|
||||
debug.append(f" Всего {len(log)} сообщений")
|
||||
except Exception as e:
|
||||
log = []
|
||||
debug.append(f"Failed to load log: {e}")
|
||||
debug.append(f"Ошибка загрузки лога: {e}")
|
||||
|
||||
# USER COMMANDS LOGIC:
|
||||
# ЛОГИКА КОМАНД ПОЛЬЗОВАТЕЛЯ:
|
||||
cmd = message.strip().lower()
|
||||
|
||||
|
||||
##### ADMIN COMMANDS #####
|
||||
##### АДМИНИСТРАТИВНЫЕ КОМАНДЫ #####
|
||||
if safe_username == SYSADMIN and cmd.startswith("/clear"):
|
||||
parts = cmd.split()
|
||||
|
||||
@@ -369,9 +355,9 @@ elif safe_username == SYSADMIN and cmd == "/clearall":
|
||||
|
||||
|
||||
|
||||
########## CHAT USERS COMMANDS #########
|
||||
########## КОМАНДЫ ПОЛЬЗОВАТЕЛЕЙ ЧАТА #########
|
||||
|
||||
#### STATS COMMAND ####
|
||||
#### КОМАНДА STATS ####
|
||||
elif cmd == "/stats":
|
||||
user_stats = {}
|
||||
user_set = set()
|
||||
@@ -390,7 +376,7 @@ elif cmd == "/stats":
|
||||
log.append({"time": time.strftime("[%a,%H:%M]"), "user": "System", "text": f"`!` Total users: {total_users} `!` "})
|
||||
|
||||
# Combine top chatters in one line
|
||||
top_line = "`!` Top chatters: `!` " + " , ".join([f"`!` {user} ({count} msg) `!`" for user, count in top_users[:5]])
|
||||
top_line = "`!` Топ участников: `!` " + " , ".join([f"`!` {user} ({count} сообщ.) `!`" for user, count in top_users[:5]])
|
||||
log.append({"time": time.strftime("[%a,%H:%M]"), "user": "System", "text": top_line})
|
||||
|
||||
############ /users COMMAND ##############
|
||||
@@ -407,12 +393,12 @@ elif cmd == "/users":
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
"text": f"`!` Active Users List and Stats, Total Users: ({total_users}) `! "
|
||||
"text": f"`!` Список активных пользователей и статистика, Всего пользователей: ({total_users}) `! "
|
||||
})
|
||||
|
||||
# Show in chunks of N with message counts
|
||||
for i in range(0, total_users, 7):
|
||||
chunk = ", ".join(f"`!` {user} `!({count}msg)" for user, count in sorted_users[i:i+7])
|
||||
chunk = ", ".join(f"`!` {user} `!({count}сообщ.)" for user, count in sorted_users[i:i+7])
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
@@ -422,35 +408,35 @@ elif cmd == "/users":
|
||||
############# /cmd COMMAND INFO LINES ############
|
||||
elif cmd == "/cmd":
|
||||
help_lines = [
|
||||
f"`!{message_icon} THE CHATROOM!{message_icon} \\ EXTENDED USER COMMANDS INFO:`!",
|
||||
f"`!GENERAL USE AND INFORMATIONAL COMMANDS:`!",
|
||||
f"`!/info`! : Show The Chat Room! Informations, Usage and Disclaimer",
|
||||
f"`!/cmd`! : Show all the available user commands",
|
||||
f"`!/stats`! : Show chatroom statistics, including Top 5 Chatters",
|
||||
f"`!/users`! : List all chatroom users",
|
||||
f"`!/version`! : Show THE CHAT ROOM! script version, news and infos",
|
||||
f"`!{message_icon} THE CHATROOM!{message_icon} \\ РАСШИРЕННАЯ ИНФОРМАЦИЯ О КОМАНДАХ ПОЛЬЗОВАТЕЛЯ:`!",
|
||||
f"`!ОБЩИЕ И ИНФОРМАЦИОННЫЕ КОМАНДЫ:`!",
|
||||
f"`!/info`! : Показать информацию о The Chat Room!, использование и отказ",
|
||||
f"`!/cmd`! : Показать все доступные команды пользователя",
|
||||
f"`!/stats`! : Показать статистику чата, включая Топ-5 участников",
|
||||
f"`!/users`! : Список всех пользователей чата",
|
||||
f"`!/version`! : Показать версию скрипта THE CHAT ROOM!, новости и информацию",
|
||||
|
||||
f"`! {cmd_icon} INTERACTIVE CHAT COMMANDS`!",
|
||||
"`!/lastseen <username>`!`: Last seen user info and latest user message",
|
||||
"`!/topic`!` : Show or Change Room Topic, usage: '/topic' or '/topic Your New Topic Here' ",
|
||||
"`!/search <keyword(s)>`!` : Search for keywords in the full chatlog ",
|
||||
"`!/time`!` : Show current Chat Server Time (UTC)",
|
||||
"`!/ping`!` : Reply with PONG! if the chat system is up and working",
|
||||
"`!/meteo <cityname>`! : Get weather info for your city, example: /meteo Miami",
|
||||
f"`! {cmd_icon} ИНТЕРАКТИВНЫЕ КОМАНДЫ ЧАТА`!",
|
||||
"`!/lastseen <username>`!`: Информация о последнем появлении пользователя и последнее сообщение пользователя",
|
||||
"`!/topic`!` : Показать или изменить тему комнаты, использование: '/topic' или '/topic Ваша новая тема здесь' ",
|
||||
"`!/search <keyword(s)>`!` : Поиск ключевых слов в полном логе чата ",
|
||||
"`!/time`!` : Показать текущее время сервера чата (UTC)",
|
||||
"`!/ping`!` : Ответить PONG! если система чата работает",
|
||||
"`!/meteo <cityname>`! : Получить информацию о погоде для вашего города, пример: /meteo Москва",
|
||||
"--------------------------------------",
|
||||
f"`! {cmd_icon} SOCIAL INTERACTIONS COMMANDS`!",
|
||||
"`!` /e`!` : Sends randomized emojis from the internal emoji list",
|
||||
"`!` /c <text message>`!` : Sends a colored chat message with randomized background and font colors",
|
||||
"`!` @nickname`!` : Sends a colored mention to highlight the mentioned user in a reply message",
|
||||
"`!` $e`!` : Sends a random emoticon using '$e', usable in every part of the message. ",
|
||||
"`!` $link`!` : Higlight your links, example: $link d251bfd8e30540b5bd219bbbfcc3afc5:/page/index.mu ",
|
||||
"`!` /welcome`! : Sends a welcome message. Usage: /welcome or /welcome <nickname>. ",
|
||||
f"`!` {cmd_icon} USER STATUS INTERACTIONS COMMANDS`!`",
|
||||
f"`! {cmd_icon} КОМАНДЫ СОЦИАЛЬНОГО ВЗАИМОДЕЙСТВИЯ`!",
|
||||
"`!` /e`!` : Отправляет случайные эмодзи из внутреннего списка эмодзи",
|
||||
"`!` /c <текстовое сообщение>`!` : Отправляет цветное сообщение чата со случайными цветами фона и шрифта",
|
||||
"`!` @nickname`!` : Отправляет цветное упоминание для выделения упомянутого пользователя в ответном сообщении",
|
||||
"`!` $e`!` : Отправляет случайный эмотикон используя '$e', можно использовать в любой части сообщения. ",
|
||||
"`!` $link`!` : Выделить ваши ссылки, пример: $link d251bfd8e30540b5bd219bbbfcc3afc5:/page/index.mu ",
|
||||
"`!` /welcome`! : Отправляет приветственное сообщение. Использование: /welcome или /welcome <nickname>. ",
|
||||
f"`!` {cmd_icon} КОМАНДЫ СТАТУСА ПОЛЬЗОВАТЕЛЯ`!`",
|
||||
"`!` /hi, /bye, /brb, /lol, /exit, /quit, /away, /back, /notice `!`",
|
||||
"`!` Commands Usage Example: /hi OR /hi Hello World! `! (Syntax is valid for all the above commands!)",
|
||||
"`!` Пример использования команд: /hi ИЛИ /hi Привет Мир! `! (Синтаксис действителен для всех вышеперечисленных команд!)",
|
||||
"--------------------------------------",
|
||||
f"`!` {cmd_icon} ADMIN COMMANDS INFO: /admincmd (Only admins allowed to perform this command) `!`",
|
||||
"`!` --------- END OF COMMAND LIST: `[CLICK TO RELOAD THE PAGE`:/page/meshchat.mu`username]` --------- `!",
|
||||
f"`!` {cmd_icon} ИНФОРМАЦИЯ ОБ АДМИНИСТРАТИВНЫХ КОМАНДАХ: /admincmd (Только администраторам разрешено выполнять эту команду) `!`",
|
||||
"`!` --------- КОНЕЦ СПИСКА КОМАНД: `[НАЖМИТЕ ДЛЯ ПЕРЕЗАГРУЗКИ СТРАНИЦЫ`:/page/meshchat.mu`username]` --------- `!",
|
||||
|
||||
]
|
||||
for line in help_lines:
|
||||
@@ -464,15 +450,15 @@ elif cmd == "/cmd":
|
||||
elif cmd == "/admincmd":
|
||||
if safe_username == SYSADMIN:
|
||||
admin_lines = [
|
||||
f"`! {cmd_icon} ADMIN COMMANDS INFO `!",
|
||||
"`! You have access to restricted administrative functions.`!",
|
||||
"`! /clear `! : Deletes last message from the chatroom and database permanently",
|
||||
"`! /clear N`! : Deletes last N messages from the chatroom and database permanently, example: /clear 3",
|
||||
"`! /clear user <nickname>`! : Delete all messages from a specified user permanently",
|
||||
"`! /clearall `! : Permanently clear the whole chatroom log and database (Irreversible: use with caution!)",
|
||||
"`! /backup `! : Creates a full chat_log.json database backup in the same chatroom script folder",
|
||||
f"`! {cmd_icon} ИНФОРМАЦИЯ ОБ АДМИНИСТРАТИВНЫХ КОМАНДАХ `!",
|
||||
"`! У вас есть доступ к ограниченным административным функциям.`!",
|
||||
"`! /clear `! : Удаляет последнее сообщение из чата и базы данных навсегда",
|
||||
"`! /clear N`! : Удаляет последние N сообщений из чата и базы данных навсегда, пример: /clear 3",
|
||||
"`! /clear user <nickname>`! : Удалить все сообщения от указанного пользователя навсегда",
|
||||
"`! /clearall `! : Навсегда очистить весь лог чата и базу данных (Необратимо: используйте с осторожностью!)",
|
||||
"`! /backup `! : Создаёт полную резервную копию базы данных chat_log.json в той же папке скрипта чата",
|
||||
"--------------------------------------",
|
||||
"`! END OF ADMIN COMMANDS LIST `!"
|
||||
"`! КОНЕЦ СПИСКА АДМИНИСТРАТИВНЫХ КОМАНД `!"
|
||||
]
|
||||
for line in admin_lines:
|
||||
log.append({
|
||||
@@ -522,12 +508,12 @@ elif cmd == "/backup":
|
||||
elif cmd == "/info":
|
||||
info_lines = [
|
||||
"`! The Chat Room v2.00 Info - Overview - Usage - Commands - Disclaimer - README! :) `!",
|
||||
"Welcome! This space is designed to connect people through an old school irc-styled interface.",
|
||||
"No registration required, set your nickname and you are ready to message with other users.",
|
||||
"Nicknames are randomly colorized and there is persistent color for every nickname.",
|
||||
"No privacy compromission: use any nick you want. Nothing is recorded or associated to your rns identity.",
|
||||
"This runs on a Nomadnet, so it will be visible internationally. Respect all the user languages in chat.",
|
||||
"This chat is based on micron, sql3 db and python components.",
|
||||
"Добро пожаловать! Это пространство предназначено для соединения людей через интерфейс в старом стиле IRC.",
|
||||
"Регистрация не требуется, установите ваш никнейм и вы готовы общаться с другими пользователями.",
|
||||
"Никнеймы случайно окрашиваются и для каждого никнейма есть постоянный цвет.",
|
||||
"Без компромиссов приватности: используйте любой никнейм. Ничего не записывается и не связывается с вашей rns идентичностью.",
|
||||
"Это работает на Nomadnet, поэтому будет видно международно. Уважайте все языки пользователей в чате.",
|
||||
"Этот чат основан на компонентах micron, sql3 db и python.",
|
||||
"You can send irc-style messages and use various commands to explore the chatroom.",
|
||||
"`!` Command Reference `!`",
|
||||
"Just Some Examples:",
|
||||
@@ -775,9 +761,9 @@ elif cmd.startswith("/hi"):
|
||||
# Format nickname using your markup style
|
||||
colored_nickname = f"`{nickname_color}{safe_username}`b"
|
||||
# Build message
|
||||
base_text = f"{colored_nickname} has joined The Chat Room!"
|
||||
base_text = f"{colored_nickname} присоединился к Чату!"
|
||||
if user_message:
|
||||
full_text = f" `!{base_text} Message: {user_message} `!"
|
||||
full_text = f" `!{base_text} Сообщение: {user_message} `!"
|
||||
else:
|
||||
full_text = f" `!{base_text} `!"
|
||||
log.append({
|
||||
@@ -791,7 +777,7 @@ elif cmd.startswith("/hi"):
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
"text": f"`!` Error processing /hi command: {e} `!`"
|
||||
"text": f"`!` Ошибка обработки команды /hi: {e} `!`"
|
||||
})
|
||||
|
||||
###### /BYE COMMAND #######
|
||||
@@ -805,9 +791,9 @@ elif cmd.startswith("/bye"):
|
||||
# Format nickname using your markup style
|
||||
colored_nickname = f"`{nickname_color}{safe_username}`b"
|
||||
# Build message
|
||||
base_text = f"{colored_nickname} is leaving The Chat Room!"
|
||||
base_text = f"{colored_nickname} покидает Чат!"
|
||||
if user_message:
|
||||
full_text = f" `!{base_text} Message: {user_message} `!"
|
||||
full_text = f" `!{base_text} Сообщение: {user_message} `!"
|
||||
else:
|
||||
full_text = f" `!{base_text} `!"
|
||||
log.append({
|
||||
@@ -821,7 +807,7 @@ elif cmd.startswith("/bye"):
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
"text": f"`!` Error processing /bye command: {e} `!`"
|
||||
"text": f"`!` Ошибка обработки команды /bye: {e} `!`"
|
||||
})
|
||||
|
||||
###### /quit COMMAND #######
|
||||
@@ -835,9 +821,9 @@ elif cmd.startswith("/quit"):
|
||||
# Format nickname using your markup style
|
||||
colored_nickname = f"`{nickname_color}{safe_username}`b"
|
||||
# Build message
|
||||
base_text = f"{colored_nickname} has quit The Chat Room!"
|
||||
base_text = f"{colored_nickname} вышел из Чата!"
|
||||
if user_message:
|
||||
full_text = f" `!{base_text} Message: {user_message} `!"
|
||||
full_text = f" `!{base_text} Сообщение: {user_message} `!"
|
||||
else:
|
||||
full_text = f" `!{base_text} `!"
|
||||
log.append({
|
||||
@@ -851,7 +837,7 @@ elif cmd.startswith("/quit"):
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
"text": f"`!` Error processing /quit command: {e} `!`"
|
||||
"text": f"`!` Ошибка обработки команды /quit: {e} `!`"
|
||||
})
|
||||
|
||||
###### /exit COMMAND #######
|
||||
@@ -865,9 +851,9 @@ elif cmd.startswith("/exit"):
|
||||
# Format nickname using your markup style
|
||||
colored_nickname = f"`{nickname_color}{safe_username}`b"
|
||||
# Build message
|
||||
base_text = f"{colored_nickname} has left The Chat Room!"
|
||||
base_text = f"{colored_nickname} покинул Чат!"
|
||||
if user_message:
|
||||
full_text = f" `!{base_text} Message: {user_message} `!"
|
||||
full_text = f" `!{base_text} Сообщение: {user_message} `!"
|
||||
else:
|
||||
full_text = f" `!{base_text} `!"
|
||||
log.append({
|
||||
@@ -881,7 +867,7 @@ elif cmd.startswith("/exit"):
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
"text": f"`!` Error processing /exit command: {e} `!`"
|
||||
"text": f"`!` Ошибка обработки команды /exit: {e} `!`"
|
||||
})
|
||||
|
||||
###### /BRB COMMAND #######
|
||||
@@ -895,9 +881,9 @@ elif cmd.startswith("/brb"):
|
||||
# Format nickname using your markup style
|
||||
colored_nickname = f"`{nickname_color}{safe_username}`b"
|
||||
# Build message
|
||||
base_text = f"{colored_nickname} has left The Chat Room! I'LL BE RIGHT BACK! BRB!"
|
||||
base_text = f"{colored_nickname} покинул Чат! СКОРО ВЕРНУСЬ! BRB!"
|
||||
if user_message:
|
||||
full_text = f" `!{base_text} Message: {user_message} `!"
|
||||
full_text = f" `!{base_text} Сообщение: {user_message} `!"
|
||||
else:
|
||||
full_text = f" `!{base_text} `!"
|
||||
log.append({
|
||||
@@ -911,7 +897,7 @@ elif cmd.startswith("/brb"):
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
"text": f"`!` Error processing /brb command: {e} `!`"
|
||||
"text": f"`!` Ошибка обработки команды /brb: {e} `!`"
|
||||
})
|
||||
|
||||
###### /lol COMMAND #######
|
||||
@@ -925,9 +911,9 @@ elif cmd.startswith("/lol"):
|
||||
# Format nickname using your markup style
|
||||
colored_nickname = f"`{nickname_color}{safe_username}`b"
|
||||
# Build message
|
||||
base_text = f"{colored_nickname} is Laughing Out Loud! LOL! :D "
|
||||
base_text = f"{colored_nickname} громко смеётся! LOL! :D "
|
||||
if user_message:
|
||||
full_text = f" `!{base_text} Message: {user_message} `!"
|
||||
full_text = f" `!{base_text} Сообщение: {user_message} `!"
|
||||
else:
|
||||
full_text = f" `!{base_text} `!"
|
||||
log.append({
|
||||
@@ -941,7 +927,7 @@ elif cmd.startswith("/lol"):
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
"text": f"`!` Error processing /lol command: {e} `!`"
|
||||
"text": f"`!` Ошибка обработки команды /lol: {e} `!`"
|
||||
})
|
||||
|
||||
###### /away COMMAND #######
|
||||
@@ -955,9 +941,9 @@ elif cmd.startswith("/away"):
|
||||
# Format nickname using your markup style
|
||||
colored_nickname = f"`{nickname_color}{safe_username}`b"
|
||||
# Build message
|
||||
base_text = f"{colored_nickname} is away."
|
||||
base_text = f"{colored_nickname} отсутствует."
|
||||
if user_message:
|
||||
full_text = f" `!{base_text} (Status: {user_message}) `!"
|
||||
full_text = f" `!{base_text} (Статус: {user_message}) `!"
|
||||
else:
|
||||
full_text = f" `!{base_text} `!"
|
||||
log.append({
|
||||
@@ -971,7 +957,7 @@ elif cmd.startswith("/away"):
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
"text": f"`!` Error processing /away command: {e} `!`"
|
||||
"text": f"`!` Ошибка обработки команды /away: {e} `!`"
|
||||
})
|
||||
|
||||
###### /back COMMAND #######
|
||||
@@ -985,7 +971,7 @@ elif cmd.startswith("/back"):
|
||||
# Format nickname using your markup style
|
||||
colored_nickname = f"`{nickname_color}{safe_username}`b"
|
||||
# Build message
|
||||
base_text = f"{colored_nickname} is back! "
|
||||
base_text = f"{colored_nickname} вернулся! "
|
||||
if user_message:
|
||||
full_text = f" `!{base_text} {user_message} `!"
|
||||
else:
|
||||
@@ -1001,7 +987,7 @@ elif cmd.startswith("/back"):
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
"text": f"`!` Error processing /back command: {e} `!`"
|
||||
"text": f"`!` Ошибка обработки команды /back: {e} `!`"
|
||||
})
|
||||
|
||||
|
||||
@@ -1016,11 +1002,11 @@ elif cmd.startswith("/welcome"):
|
||||
# Format nickname using your markup style
|
||||
colored_nickname = f"`{nickname_color}{safe_username}`b"
|
||||
# Build message
|
||||
base_text = f"{colored_nickname} Welcomes "
|
||||
base_text = f"{colored_nickname} приветствует "
|
||||
if user_message:
|
||||
full_text = f" `!{base_text} {user_message} `!"
|
||||
else:
|
||||
full_text = f" `!{base_text} everyone! `!"
|
||||
full_text = f" `!{base_text} всех! `!"
|
||||
log.append({
|
||||
"time": timestamp,
|
||||
"user": "System",
|
||||
@@ -1032,7 +1018,7 @@ elif cmd.startswith("/welcome"):
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
"text": f"`!` Error processing /welcome command: {e} `!`"
|
||||
"text": f"`!` Ошибка обработки команды /welcome: {e} `!`"
|
||||
})
|
||||
|
||||
###### /notice COMMAND #######
|
||||
@@ -1046,7 +1032,7 @@ elif cmd.startswith("/notice"):
|
||||
# Format nickname using your markup style
|
||||
colored_nickname = f"`{nickname_color}{safe_username}`b"
|
||||
# Build message
|
||||
base_text = f"NOTICE FROM {colored_nickname}:"
|
||||
base_text = f"УВЕДОМЛЕНИЕ ОТ {colored_nickname}:"
|
||||
if user_message:
|
||||
full_text = f" `!{base_text} {user_message} `!"
|
||||
else:
|
||||
@@ -1062,7 +1048,7 @@ elif cmd.startswith("/notice"):
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
"text": f"`!` Error processing /notice command: {e} `!`"
|
||||
"text": f"`!` Ошибка обработки команды /notice: {e} `!`"
|
||||
})
|
||||
|
||||
####### METEO COMMAND #######
|
||||
@@ -1151,7 +1137,7 @@ elif cmd.startswith("/meteo"):
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
"text": f"Error processing /meteo command: {e} "
|
||||
"text": f"Ошибка обработки команды /meteo: {e} "
|
||||
})
|
||||
|
||||
|
||||
@@ -1172,7 +1158,7 @@ elif raw_username and message and message.lower() != "null":
|
||||
log.append({
|
||||
"time": time.strftime("[%a,%H:%M]"),
|
||||
"user": "System",
|
||||
"text": f"Spam Detected! Message Blocked! Triggered by: '{trigger_word}'"
|
||||
"text": f"Обнаружен спам! Сообщение заблокировано! Сработало на: '{trigger_word}'"
|
||||
})
|
||||
debug.append(f" Spam blocked from '{safe_username}'")
|
||||
else:
|
||||
@@ -1189,12 +1175,12 @@ elif raw_username and message and message.lower() != "null":
|
||||
except Exception as e:
|
||||
debug.append(f" Send error: {e}")
|
||||
else:
|
||||
debug.append(" Page Reloaded. Idle. Void Message. Waiting for user interactions. For extended commands info digit: /help")
|
||||
debug.append(" Страница перезагружена. Простой. Пустое сообщение. Ожидание взаимодействия пользователя. Для расширенной информации о командах введите: /help")
|
||||
|
||||
|
||||
|
||||
|
||||
######### Helper function to split long messages using MAX CHARS ########
|
||||
######### Вспомогательная функция для разбиения длинных сообщений используя MAX CHARS ########
|
||||
def split_message(text, max_chars):
|
||||
words = text.split()
|
||||
lines = []
|
||||
@@ -1226,7 +1212,7 @@ def calculate_effective_limit(log, max_lines, max_chars):
|
||||
effective_limit, total_lines = calculate_effective_limit(log, MAX_LINES, MAX_CHARS)
|
||||
|
||||
|
||||
########## UTC server time to local time dynamic conversion ##########
|
||||
########## Динамическое преобразование времени сервера UTC в локальное время ##########
|
||||
from datetime import datetime
|
||||
|
||||
def convert_log_time_to_local(log_time_str):
|
||||
@@ -1259,7 +1245,7 @@ def convert_log_time_to_local(log_time_str):
|
||||
|
||||
return local_dt.strftime("%a,%H:%M")
|
||||
|
||||
######### mention users def logic on @user message ########
|
||||
######### логика определения упоминаний пользователей в сообщениях @user ########
|
||||
def highlight_mentions_in_line(line, known_users):
|
||||
def replacer(match):
|
||||
nickname = match.group(1)
|
||||
@@ -1270,7 +1256,7 @@ def highlight_mentions_in_line(line, known_users):
|
||||
return f"@{nickname}" # Leave uncolored
|
||||
return re.sub(r"@(\w+)", replacer, line)
|
||||
|
||||
######## $E FOR EMOTICONS ########
|
||||
######## $E ДЛЯ ЭМОТИКОНОВ ########
|
||||
with open(EMO_DB, "r", encoding="utf-8") as f:
|
||||
EMOTICONS = []
|
||||
for line in f:
|
||||
@@ -1279,7 +1265,7 @@ with open(EMO_DB, "r", encoding="utf-8") as f:
|
||||
def substitute_emoticons_in_line(line):
|
||||
return re.sub(r"\$e", lambda _: random.choice(EMOTICONS), line)
|
||||
|
||||
######## LINK MENTIONS ######
|
||||
######## УПОМИНАНИЯ ССЫЛОК ######
|
||||
def format_links_in_line(line):
|
||||
def replacer(match):
|
||||
link = match.group(1)
|
||||
@@ -1291,11 +1277,11 @@ def format_links_in_line(line):
|
||||
############################## Output UI template: ######################################
|
||||
|
||||
#INTRO TITLE:
|
||||
template = f"> `!{message_icon} THE CHAT ROOM! {message_icon} `F007` Powered by Reticulum NomadNet - IRC Style - Free Global Chat Room - Optimized for Meshchat v2.x+ - v2.00 `f`!\n"
|
||||
template = f"> `!{message_icon} THE CHAT ROOM! {message_icon} `F007` Работает на Reticulum NomadNet - IRC стиль - Бесплатный глобальный чат - Оптимизировано для Meshchat v2.x+ - v2.00 `f`!\n"
|
||||
template += "-\n"
|
||||
|
||||
# TOPIC READING AND RENDERING:
|
||||
template += f"`c`B000`Ff2e`!###### Room Topic: {topic_text} `! (Set by: {topic_author}, {topic_data.get('time')}) `! `!`f`b`a\n"
|
||||
# ЧТЕНИЕ И ОТОБРАЖЕНИЕ ТЕМЫ:
|
||||
template += f"`c`B000`Ff2e`!###### Тема комнаты: {topic_text} `! (Установлена: {topic_author}, {topic_data.get('time')}) `! `!`f`b`a\n"
|
||||
template += "-\n"
|
||||
|
||||
# Build set of known usernames
|
||||
@@ -1325,27 +1311,27 @@ template += "-"
|
||||
# sanitize and read name from display_name os env
|
||||
safe_display_name = display_name.replace("`", "'")
|
||||
|
||||
template += f"\n>`!` {user_icon} Nickname: `Baac`F000`<12|username`{safe_display_name}>`!`b`[{nickset_icon} `:/page/meshchat.mu`username]`! {message_icon} Message: `Baac`<52|message`>`b`!"
|
||||
template += f" `!`[{send_icon} Send Message`:/page/meshchat.mu`username|message]`! | `!`[{reload_icon} Reload`:/page/meshchat.mu`username]`!\n"
|
||||
template += f"\n>`!` {user_icon} Никнейм: `Baac`F000`<12|username`{safe_display_name}>`!`b`[{nickset_icon} `:/page/meshchat.mu`username]`! {message_icon} Сообщение: `Baac`<52|message`>`b`!"
|
||||
template += f" `!`[{send_icon} Отправить сообщение`:/page/meshchat.mu`username|message]`! | `!`[{reload_icon} Перезагрузить`:/page/meshchat.mu`username]`!\n"
|
||||
|
||||
|
||||
template += "-\n"
|
||||
|
||||
# USER COMMANDS
|
||||
template += f"`B216`Fddd` {cmd_icon} User Commands: /info, /stats, /users, /topic, /search <keyword(s)>, /time, /ping, /version, -------> `!Full Command List: /cmd `!`b`f\n"
|
||||
# КОМАНДЫ ПОЛЬЗОВАТЕЛЯ
|
||||
template += f"`B216`Fddd` {cmd_icon} Команды пользователя: /info, /stats, /users, /topic, /search <ключевые слова>, /time, /ping, /version, -------> `!Полный список команд: /cmd `!`b`f\n"
|
||||
|
||||
# MENUBAR
|
||||
template += f"`B317`Feee` `!` {message_icon} Total Messages: ({len(log)}) | {message_icon} On Screen Messages: ({total_lines}) | {totmsg_icon} `[Read Last 100`:/page/last100.mu]` | {totmsg_icon} `[Read Full Chat Log (Slow)`:/page/fullchat.mu]`! | `!`[{setup_icon} User Settings `:/page/meshchat.mu`username]` `!`b`f"
|
||||
# ПАНЕЛЬ МЕНЮ
|
||||
template += f"`B317`Feee` `!` {message_icon} Всего сообщений: ({len(log)}) | {message_icon} Сообщений на экране: ({total_lines}) | {totmsg_icon} `[Прочитать последние 100`:/page/last100.mu]` | {totmsg_icon} `[Прочитать полный лог чата (Медленно)`:/page/fullchat.mu]`! | `!`[{setup_icon} Настройки пользователя `:/page/meshchat.mu`username]` `!`b`f"
|
||||
|
||||
# NICKNAME DETECTION STATUS ON PAGE LOAD
|
||||
# СТАТУС ОПРЕДЕЛЕНИЯ НИКНЕЙМА ПРИ ЗАГРУЗКЕ СТРАНИЦЫ
|
||||
if display_name.startswith("Guest_"):
|
||||
template += f"`B222`Ff00` Fingerprint Detected! Temporary Nickname set to: {display_name}. Set a new nickname and press the {nickset_icon} reload button next to your name.`b`f`"
|
||||
template += f"`B222`Ff00` Отпечаток обнаружен! Временный никнейм установлен: {display_name}. Установите новый никнейм и нажмите кнопку {nickset_icon} перезагрузки рядом с вашим именем.`b`f`"
|
||||
|
||||
elif display_name == "Guest":
|
||||
template += "`B222`Ff00` ** You're currently using a generic name. Set a nickname to personalize your session. Press Fingerprint to save or recover it.`b`f`"
|
||||
template += "`B222`Ff00` ** Вы сейчас используете общее имя. Установите никнейм для персонализации вашей сессии. Нажмите Fingerprint для сохранения или восстановления.`b`f`"
|
||||
|
||||
elif nickname_recovered_from_db:
|
||||
template += f"`B060`F0f0` Fingerprint match successful! Nickname recovered from db: {display_name}, Bound to LXMF Address: {dest}`b`f`"
|
||||
template += f"`B060`F0f0` Совпадение отпечатка успешно! Никнейм восстановлен из БД: {display_name}, Привязан к адресу LXMF: {dest}`b`f`"
|
||||
|
||||
# RENDER UI:
|
||||
print(template)
|
||||
|
||||
530
nomadnet.mu
530
nomadnet.mu
File diff suppressed because it is too large
Load Diff
@@ -1 +1 @@
|
||||
{"text": "Welcome To The Chat Room! - The last bastion of free speech!", "user": "System", "time": "01 August 2025"}
|
||||
{"text": "Добро пожаловать в Чат! - Последний бастион свободы слова!", "user": "System", "time": "12 ноября 2025"}
|
||||
|
||||
Reference in New Issue
Block a user