Mark24
用Ruby打造一个命令行聊天Slack
前言
大家好,我是Mark24
项目仓库:
- Client Mark24Code/mchat
- Server Mark24Code/mchat_server
我调整了一下顺序
这部分分为:
- 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/mchatrc 中
server: "http://localhost:4567"
可以调整为自己搭建的服务器地址
采用双栏布局
- 左边是消息预览,这里称为
mchat_timeline
- 右侧是命令REPL,类似终端回应你的命令,称为
mchat_repl
mchat
会打开聚合窗口(基于screen)
你可以单独的打开 mchat_timeline
、 mchat_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
- 联合关闭