easydu2002 / chat_gpt_oicq

ChatGPT qq机器人 谁不想拥有一只可爱的猫娘呢~
MIT License
284 stars 38 forks source link

添加支持多用户不同会话功能 #8

Closed Lukangkang123 closed 1 year ago

Lukangkang123 commented 1 year ago

每次私聊一个会话,一个QQ群一个会话。默认每次会话过期时间为五分钟(可作为超参数)。新建session和发送一条消息后均在控制台打印日志(方便查看每个保留的会话内容)。

easydu2002 commented 1 year ago

感谢pr !!!

建议:

  1. R97 数组容量本身就已经根据配置的大小设定好了,添加的时候或许无需判断,直接一进一出即可,
  2. Session可以作为 ChatGPTOfficialHandler 的一个实例属性,Session内部维护一个map(用户id => 消息),ChatGPTOfficialHandler就不需要操作message这些了, 大概就像这样

    
    class ChatGPTOfficialHandler extends BaseMessageHandler {
    name = 'officialAPI'
    session = new Session()
    }
    class Session {
    _trackMap: Map<number, string[]>
    
    pushTrackMessage (userId: number, message: string) {
    // ....
    }
    
    getById (userId: number) {
    return this._trackMap.get(userId)
    }
    }


总之感谢pr!!
我晚上回去确认可行就合并
easydu2002 commented 1 year ago

另外 需要扩展 config 直接添加即可,这个可以加到 L25

Lukangkang123 commented 1 year ago

感谢pr !!!

建议:

  1. R97 数组容量本身就已经根据配置的大小设定好了,添加的时候或许无需判断,直接一进一出即可,
  2. Session可以作为 ChatGPTOfficialHandler 的一个实例属性,Session内部维护一个map(用户id => 消息),ChatGPTOfficialHandler就不需要操作message这些了, 大概就像这样
class ChatGPTOfficialHandler extends BaseMessageHandler {
  name = 'officialAPI'
  session = new Session()
}
class Session {
  _trackMap: Map<number, string[]>

  pushTrackMessage (userId: number, message: string) {
    // ....
  }

  getById (userId: number) {
    return this._trackMap.get(userId)
  }
}

总之感谢pr!! 我晚上回去确认可行就合并 但是直接一进一出的话,不就相当于每次数组里就只有一个元素吗?

easydu2002 commented 1 year ago

不会的, R76

Array.from(new Array(this.config.maxTrackCount), () => '')

这段代码就相当于创建了一个固定长度的数组

整个操作就可以理解为维护一个定长的队列,尾部添加一个,首部就移除一个

比如maxTrackCount=3的时候

结果就是3个空字符串 ['', '', '']

添加的时候,尾部先加一个(push) ['', '', '', 'message'] 头部再剔除一个 (shift) ['', '', 'message']

easydu2002 commented 1 year ago

表述的可能不严谨,但是大体上应该没问题

image

Lukangkang123 commented 1 year ago

不会的, R76

Array.from(new Array(this.config.maxTrackCount), () => '')

这段代码就相当于创建了一个固定长度的数组

整个操作就可以理解为维护一个定长的队列,尾部添加一个,首部就移除一个

比如maxTrackCount=3的时候

结果就是3个空字符串 ['', '', '']

添加的时候,尾部先加一个(push) ['', '', '', 'message'] 头部再剔除一个 (shift) ['', '', 'message']

哦哦,明白了,不过还有个问题,你写的这个_trackMap没有时间,要么还是把Value设置为一个类,要么直接再创建另一个Map来保存id和时间的映射。

easydu2002 commented 1 year ago

要么还是把Value设置为一个类

可以的,我建议就这种吧

Lukangkang123 commented 1 year ago

要么还是把Value设置为一个类

可以的,我建议就这种吧

好的,可以可以~