LINUX.ORG.RU
ФорумTalks

GoidaPhone NT Server 1.8 — ищу контрибьюторов для открытого мессенджера (GPL v3)

 ,


0

3

Ищу наставников/контрибьюторов для open-source мессенджера (Python/C++/Qt/KDE)

Я 16-и летний solo-разработчик из России, два года в одиночку пишу GoidaPhone - открытый мессенджер с полноценной экосистемой под лицензией GNU GPL v3.

Что такое GoidaPhone?

Это не просто мессенджер. Это платформа:

  • Мессенджер с голосовыми звонками, групповыми чатами, демонстрацией экрана
  • Встроенный медиаплеер (Mewa)
  • Встроенный браузер (WNS) на базе QtWebEngine
  • 20 слоёв криптографической защиты (X25519, Ed25519, AES-256-GCM, HMAC, replay guard)
  • Три режима связи: LAN / VPN / VDS (через goidaphone.ru) / relay
  • Три языка из коробки: RU / EN / JP

Стек: Python + PyQt6, написан с прицелом на KDE 6 / Linux

Чем сейчас занимаюсь

планирую переписать всё на C++ для версии 1.9, параллельно поддерживаю 1.8.

Какая помощь нужна

Буквально любая:

  • Code review - код не идеальный, знаю, буду рад взгляду со стороны
  • Баг репорты - просто попробуйте запустить
  • Контрибьюторы в код - Python, C++, сеть, криптография
  • Тестирование на разных дистрибутивах
  • Идеи и обратная связь

структура проекта

/…

  • gdf.py - точка входа
  • gdf_apps.py - сборник внутренних мини программ
  • gdf_browser.py - QtWebEngine браузер «WNS» встроенный в GoidaPhone
  • gdf_chats.py - логика и оформления чатов
  • gdf_core.py - константы, безопасность, ещё утилиты, уведомления, темы, локализация настройки
  • gdf_dialogs.py - настройки, профили пользователей, звонки, заметки
  • gdf_gcc.py - GC++ это консольный построитель GoidaPhone с включением и отключением модулей и сборки из исходников. включение/отключение ; встраивание python плагинов ; конфигурация через goida.json ; маркировка GC++ для отличия ванильных клиентов от собранных лично
  • gdf_main.py - создание основного окна, быстрая настройка, туториал, точка входа
  • gdf_network.py - история, метка прочитанного сообщения, реакции, обновление GoidaPhone, аудио, протоколы, сеть, отправка/принятие голоса, отправка/принятие файлов
  • gdf_ui_base.py - лаунчер с выбором запуска (GC++/CMD/GUI), экран заставки, анимации, просмотр изображений

Принимаю pull request’ы, issues, форки - всё приветствуется. Проект живой, не заброшен, сам пользуюсь время от времени. Спасибо за внимание

Перемещено ilinsky из development



Последнее исправление: Pixless (всего исправлений: 1)
Ответ на: комментарий от Pixless

Вообще все что протокол и api должно быть cначала и полностью покрыто тестами, т.е. начать надо с того, что просто 90% функционала текущего выкидывается, пока core не будет достаточно стабильной и безопасной. Условно, это только текстовые сообщение и три режима связи, потом уже голосовые сообщения добавлять и снова убеждаться что они работают и безопасны на тестах. Это все должно быть покрыто на 100%. А вот ui к этому всему можно вообще сделать чисто экспериментальный полностью на AI и ждать что кто-то, кто умеет делать интерфейса подтянется в проект. Желательно наверное в одного делать только веб и android фронтенд, т.е. тот который запустится везде, и охватит как можно больше пользователей, так как задача набрать пользователей и как-то дать огласку проекту, это самое сложное. Наверное я бы рекомендовал React Native, чтобы закрыть сразу веб и android, плюс чтобы ИИ сильно не в этом тупил, если нет опыта объяснить ему как нужно делать. Ну и чтобы не распыляться слишком сильно на две экосистемы.

anonymous_sama ★★★★★
()
Последнее исправление: anonymous_sama (всего исправлений: 2)

Вообще как я думаю не изобретай велосипед, бери Signal + Ratchet внутри WebRTC или опционально внутри ws. Этого будет достаточно чтобы обойти DPI.

Также следует почитать: https://noiseprotocol.org/noise.html

anonymous_sama ★★★★★
()
Последнее исправление: anonymous_sama (всего исправлений: 1)
Ответ на: комментарий от Pixless

где 30 от нейронки поскольку не всё у меня получается и многое ещё не понимаю.

С таким подходом ты и не начнёшь никогда понимать. Ты даже комментарии тут пишешь с помощью генераторов, так и общаться нормально разучишься / не научишься. Печально это всё.

Если чего-то не понимаешь - изучай а затем только делай.

firkax ★★★★★
()
Ответ на: комментарий от ratvier

не умеет. Можно найти пункт в настройки->для специалистов IPv6 отключён по умолчанию и не умеет обнаруживать и общаться с ними. в коде отфильтровывается

в gdf_network.py есть момент один

if host.startswith("::ffff:"):
    host = host[7:]  # конвертирует в IPv4
Pixless
() автор топика

Давай так. Для начала, ты начнёшь с:

- базового изучения оформления кода и ведения репозиториев

- изучишь лучшие практики структурирования кода

- изучишь как работать с нейросетями так что бы они не гененрировали нейрослоп который ты сам не понимаешь (это сложно, но с опытом научишься)

- изучишь практики написания кода на Python что бы уметь различать откровенный шлак от кода который можно хоть как то поддерживать и уберечь от регрессии

- научишься писать на форумах без использования нейросетей

- создашь приемлемый для восприятия код своего проекта

- придёшь сюда и скажешь, что всё усвоил и теперь можно смотреть по новому

А пока, я перенесу это, с позволения сказать «творение» в Talks и впредь, пока ты не пройдёшь все указанные пункты - твои посты в таком виде как этот будут нещадно сноситься с -20.

И нет, это не кровавая модерастия, а твой шанс не повторить путь уже известных персонажей на весь интернет. А он, как известно, помнит всё. Учись, изучай, читай, и наращивай свои скиллы. На текущий момент, то что ты сюда вылил, не вызывает ничего кроме улыбки, ибо это никуда не годится, ни по качеству кода, ни по подаче. Без обид.

ilinsky ★★★★★
()
Ответ на: комментарий от Pixless

как мне кажется, ИИ хороший помощник

обсудить конкретно по существу мой проект

Ты думаешь, что мы уводим тему из конструктивного русла, но это не так.

Попробуй сейчас ответить на вопрос, почему мы так легко поняли, что то, что ты нам выдал (в т. ч. в комментах) — результат работы БЯМ? (Подсказка: не от впечатлённости высоким уровнем материала.)

BruteForce ★★★★
()

Какой-то вариант LeechCraft =-)

hatred ★★★★
()
Ответ на: комментарий от sn4il

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

Pixless
() автор топика
Ответ на: комментарий от michwill

Причём тут обои? Если вы про те обои, которые ставятся вместо статичного фона у переписок, то идея хорошая, но честно говоря, пока не до этого

Pixless
() автор топика
Ответ на: комментарий от michwill

Факт!

Чем он чейчас занимается? Министр цифрового развития?

BruteForce ★★★★
()
Последнее исправление: BruteForce (всего исправлений: 1)
Ответ на: комментарий от BruteForce

Прочитал статью, как будто бы он слишком самоуверен 😶. Может быть чем-то похож раз вы так считаете

Pixless
() автор топика
Ответ на: комментарий от BruteForce

Давай я выдам тебе код, а ты скажешь на глаз БЯМ или я это писал или вместе и сколько там от человека, а сколько от робота:

Файл jsonnode.h

#ifndef JSONNODE_H
#define JSONNODE_H
#include <QString>
#include <QVector>

class JsonNode
{
public:
    JsonNode(const QString& name, JsonNode* parent = nullptr);
    ~JsonNode();
    
    void appendChild(JsonNode* child);
    JsonNode* child(int row) const;
    int childCount() const;
    int row() const;
    JsonNode* parentItem() const;
    
    QString name() const;
    void setName(const QString& name);
    
private:
    QString m_name;
    JsonNode* m_parent;
    QVector<JsonNode*> m_children;
};

#endif // JSONNODE_H

Файл jsonnode.cpp

#include "jsonnode.h"

JsonNode::JsonNode(const QString &name, JsonNode *parent)
    : m_name(name), m_parent(parent) {}

JsonNode::~JsonNode()
{
    QVector<JsonNode*> nodesToDelete;
    nodesToDelete.append(m_children);
    int i = 0;
    while (i < nodesToDelete.size()) {
        JsonNode* current = nodesToDelete[i];
        if (current) {
            nodesToDelete.append(current->m_children);
            current->m_children.clear();
            delete current;
        }
        i++;
    }
}

void JsonNode::appendChild(JsonNode *child)
{
    child->m_parent = this;
    m_children.append(child);
}

JsonNode *JsonNode::child(int row) const
{
    return m_children.value(row);
}

int JsonNode::childCount() const
{
    return m_children.count();
}

int JsonNode::row() const
{
    if (m_parent) {
        return m_parent->m_children.indexOf(const_cast<JsonNode*>(this));
    }
    return 0;
}

JsonNode *JsonNode::parentItem() const
{
    return m_parent;
}

QString JsonNode::name() const
{
    return m_name;
}

void JsonNode::setName(const QString &name)
{
    m_name = name;
}

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от BruteForce

А я о том, что дело не в БЯМ, а в том, что ТС не до конца понимает что он делает. Без БЯМ у него просто код бы не запускался и он бы забил на всё.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Как будто использование БЯМ это что-то плохое в данном случае. Главное чтоб криптографию не доверял железке, а интерфейсы делает очень ок на qt по-моему

michwill ★★★★★
()
Ответ на: комментарий от peregrine

честно говоря я не силён в C++, но если постараться определить на глаз то…а, так это же Qt! тут всё как будто бы написано человеком или 90 на 10. особенно вот интересно во втором файле

JsonNode::~JsonNode()
{
    QVector<JsonNode*> nodesToDelete;
    nodesToDelete.append(m_children);
    int i = 0;
    while (i < nodesToDelete.size()) {
        JsonNode* current = nodesToDelete[i];
        if (current) {
            nodesToDelete.append(current->m_children);
            current->m_children.clear();
            delete current;
        }
        i++;
    }
}

БЯМ обычно любюит всякие рекурсии, а тут «QVector<JsonNode*> nodesToDelete;» и цикл while, что как будто бы более человечно. короче мой окончательный ответ 100 на 0, ну либо 97 на 3 если скелет был сгенерирован тут мне тяжело понять

Pixless
() автор топика
Ответ на: комментарий от Pixless

По моему опыту общения, БЯМ лепит while всюду где надо и не надо.

BruteForce ★★★★
()
Ответ на: комментарий от Pixless

Нет, это всё gemeni, не его там только

#ifndef JSONNODE_H
#define JSONNODE_H
...
#endif // JSONNODE_H

И то, потому что QtCreator такой код генерирует. Другое дело что рекурсия была предложена первой, но мне не понравилось (стек не бесконечен) и я потребовал её убрать. Вообще на C, C++ и Rust оно неплохо пишет. А вот при попытке заставить его писать на Go там код плавает туда-сюда. Видимо кодовая база на обучение сильно меньше.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 3)
Ответ на: комментарий от peregrine

на C, C++ … оно неплохо пишет

Не сталкивался =\

Тыкал актвино Gemini 3 Pro Preview на эту тему. Польза, ИМХО, только в (ре)генерации нужных кусков дока\примеров, а ля «HTTP GET curl easy request example»

BruteForce ★★★★
()
Ответ на: комментарий от BruteForce

Просто не переусложняй архитектуру и не требуй от него слишком больших кусков, начинай новый чат, когда он забьётся. Про агентов не подскажу.

А с сишкой и растишкой вообще всё просто, там ООП с ехала абстракция через абстракцию нет (местами и у меня от такого голова пухнет), потому пиши ему требования по типу: напиши функцию на ЯП, которая делает то и то. Проверь её на корректность. Напиши тест. Дальше тебе придётся этот тест прогнать и если что-то не так, то опять тут ошибка, тест не проходит. Агент в принципе это и должен делать автоматически, а чтоб в процессе не произошло ничего плохого с ОС, всё должно происходить в контейнере. Единственное, жонглировать функциями в большом проекте придётся тебе самому, т.к. внимание у него не резиновое и опять, проблемы с декомпозицией и мультихед аттеншеном пока полноценно не решены.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Просто не переусложняй архитектуру и не требуй от него слишком больших кусков, начинай новый чат, когда он забьётся. Про агентов не подскажу.

Да я про «просто функции». Дальше трех ответов вообще хтдить невозможно: зирошот, корректировка, корректировка — в утиль.

Если БЯМ просить написать тест, то БЯМ напишет тест, чтобы тест проходился. Нельзя показывать БЯМ код целевой функции.

BruteForce ★★★★
()
Ответ на: комментарий от BruteForce

Нельзя показывать БЯМ код целевой функции

Программисту тоже нельзя. В идеале потому 2 разных человека код и тесты пишут. Иначе будет одна и та же ошибка в коде и тесте.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 2)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)