用Ruby打造一个命令行聊天Slack

前言

大家好,我是Mark24

项目仓库:

mchat_preview.png

我调整了一下顺序

这部分分为:

  • Mchat 使用说明: 搭建和使用Mchat

后面分享 Mchat 开发故事

  • Mchat 背景
  • Mchat 原理
  • 开发中 Ruby 的使用和思考 ……

Mchat 搭建和使用

1)Mchat Server

项目 mchat_server

想了下我的小破服务器不足以提供所谓的官方服务。也为了避免攻击。 所以感兴趣的自行搭建好了。服务端很简单,一个单点服务器:

环境:

  • 1)一个正在工作的 Redis
  • 2)服务器设置 REDIS_URL 指定redis地址
  • 3)Ruby 2.7.0 + (本人在 Ruby 3.1.0)

服务:

  • 4)bundle install
  • 5)bundle exec rake server:prod

更多

  • 可以使用 Nginx 负载均衡等等

更丰富的可以编辑项目中自带的 dockerfile 可以在局域网中、自己的网站服务器上进行搭建。

2) Mchat 客户端

介绍 Mchat

Mchat 可以叫他 Mini Chat、 Mark(作者)Chat、Moyu(摸鱼)Chat、MicoChat ……

Mchat 灵感来自于 IRC 聊天、Slack办公IM。基于 Channel 的思想来自于 Slack/IRC, 即用即抛式的使用方式来自于 IRC。当然Mchat和他们没法比,专注在轻量级实现,后面功能会介绍。

界面使用命令行,因为对于工程师很方便。聊天记录就像日志一样输出。

核心原理

这是一个及时阅后即焚特征的软件,背后用 Redis 默认的key过期特性实现

  • 无账号系统
  • 无埋点日志
  • 无数据存储

完全尊重你的隐私,它只会在相同的时间内,把同一个channel的数据广播给需要的人。

简单、纯粹 …… 这就是我想要的。

当然实际上会复杂一些,细节的使用请看下面。

安装方法

环境:

  • 确保你拥有 Ruby 2.7.0+
  • 确保你拥有 screen
## 安装 screen

# debian/ubuntu/mint
sudo apt install screen
# mac os x
brew install screen

安装mchat:gem install mchat

Mchat 使用介绍

mchat_preview.png

第一次初始化之后,会帮助用户生成配置文件,由于无官方服务提供,需要自己配置服务

配置文件 ~/.mchat/mchatrc 中

server: "http://localhost:4567"

可以调整为自己搭建的服务器地址

采用双栏布局

  • 左边是消息预览,这里称为 mchat_timeline
  • 右侧是命令REPL,类似终端回应你的命令,称为 mchat_repl

mchat 会打开聚合窗口(基于screen)

你可以单独的打开 mchat_timelinemchat_repl

mchat_repl 类似于服务器,他应该先被打开 mchat_timeline 类似于客户端,他是被动,应该后被打开

使用流程和概念

核心概念:

用户,加入Channel(频道)、拥有Name(名字),即可发言。

所有命令都是围绕这句话来进行。

比如 频道相关?

  • /channel 查看所有频道
  • /join <channel_name> 加入一个频道
  • /leave 离开频道

比如名字相关?

  • /name <your_name> 在这个频道中建立一个名字
  • /channel <channel_name> 查看这个频道的详情,在线用户

发一条消息

  • /message <content> 发送消息 很显然这里发消息是常用操作,太过繁琐

Default Mode

这里只要 进入 channel、拥有 name,默认没有命令前缀的任何输入当做消息处理被发送。 这被称为是 Default Mode

退出

  • /quit 退出 Mchat

所有的命令都可以有简写。比如 /quit 就是 /q

mchat 进入之后 mchat_repl 可以就像终端一样的正常输入 基本的步骤都有引导,详细可以键入 /h 一些文档还在补充中。 不过使用起来很简单。

Boss Mode

如果你突然觉得不希望被人看到你在聊什么

试试 /bossmode 简写 /b

信息流会被假日志覆盖,再次输入 /b 会还原最近100条消息。中间没看到的消息依然会被存入队列展示。一切不用担心 :P

Mchat 开发故事

背景

最近项目进入尾声,维护期稍微得了一点空闲。还是打算简单的写下一周左右摸鱼的结果。 :D

起源来自于和朋友微信聊到了 ESP32 这个国产微控制处理器,结果当天我们的电商信息流里就出现了推荐商品。偷窥我们隐私的应用无处不在。每次都想找个替代品。

我一直想做一个即用即抛式聊天软件,在上家公司和同事交流过,不过当时的水平还不行。

好吧,好消息是今天我终于完成了。 完成的过程比较坎坷,这也为什么值得记录。

没有做成互动式UI

没有把UI做成跟微信一样,基于几点考虑

1)Ruby 的 Curses 标准库提供的文档、API实在是有限,绘制界面难度太高,折腾他的时间 ROI 太低(希望纯ruby安装依赖少) 2)NCurses 有自己的模型,不透明,addStr+refresh 这个让 print 操作变得很繁琐 3)命令行界面很酷 4)命令行界面方便摸鱼 —— Mchat 提供了 Boss Mode 聊天窗口快速切换为日志打印 :P 5)Mchat 可以在任何地方工作,只需要一个 ruby 解释器,也可以在服务端、树莓派……

关于 Curses 绘制 TUI 的啰嗦

实际上我尝试了一些实验性: [mchat_experiment repo](https://github.com/Mark24Code/mchat_experiment)

不过这个仓库是私有,不打算公开了。

简单说就是在 命令行里尝试提供 React 那样的接口、JSX、MVVM 的方式构建UI。
时间和精力有限,Curses暴露的太少,就此作罢。

更多的感慨在于 —— 还是前端的基建难,尝试写了CSS就能感受到CSS排版引擎的恐怖。最终这方面没有被投入使用。

有趣的点

mchat_experiment 那些浪费时间

这里不公开(太潦草),但是可以说一说。

1 交互式程序

一个交互的程序需要具备的

  • 单线程模型

单线程模型需要处理用户事件、用户

TODO

2.左右UI的故事

轮询是个好办法

模块化Core

动态代码可以写代码但是依然很局限

通讯就需要文件

文件交换

Pstore

标准库有求必应


Mchat v0.1.0 ChangeLog

  • repl主流程
  • 命令模块化
  • help 命令
  • channel 命令
  • join 命令
  • name 命令
  • message 命令
  • leave 命令
  • quit 命令
  • clear 命令
  • default mode
  • boss mode
  • 存储 Pstore 实现取代文件

timeline

  • timeline 独立
  • 支持简单命令
  • hook_quit

union

  • 联合打开screen window
  • 联合关闭

Mark24

Everything can Mix.