wm: irc-h2o-bot

ref: 04f5e130140d3a42306923498cb69ea80982357c
dir: /bot.rb/

View raw version
require 'net/http'
require 'uri'
require 'json'
require 'IRC'

config = File.read('CONFIG')

parsed_config = JSON.parse(config)
Server = parsed_config['IRCServer']
BotNick = parsed_config['BotNickName']
$URL = parsed_config['SessionUrl']
$Cookie = parsed_config['SessionCookie']

$bot = IRC.new(
  BotNick,
  Server,
  "6667",
  "H2O")

class Sender

  def Wait(peer, from = nil)
    if from != nil
      $bot.send_message(peer, "#{from}, Im thinking...")
    else
      $bot.send_message(peer, "Im thinking...")
    end
  end

  def SendReq(peer, input, c)
    uri = URI($URL)
    https = Net::HTTP.new(uri.host, uri.port)
    https.use_ssl = true

    request = Net::HTTP::Post.new(uri.path)

    request['Content-Type'] = 'application/json; charset=UTF-8'
    request['User-Agent'] = 'Pedaret Mozilla/5.0 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.127 Safari/537.36'
    request['Cookie'] = $Cookie

    request.body = '{"inputs":"'+ input.to_s() +'","parameters":{"temperature":0.1,"truncate":2048,"max_new_tokens":1024,"do_sample":true,"repetition_penalty":1.2,"return_full_text":false},"stream":true,"options":{"id":"6543eb99-e311-4f4e-b791-7af4fcbe556b","response_id":"b194833d-e13c-4390-9d7f-3cf4e4d95430","is_retry":false,"use_cache":false,"web_search_id":""}}'

    begin
      response = https.request(request)


      json_strings = response.body.split('data:')

      parsed_json_objects = []

      json_strings.each do |json_str|
        if json_str != ''
          parsed_json_objects << JSON.parse(json_str)
        end
      end

      counts = 0

      b = ''
      parsed_json_objects.each do |json_obj|
        result = json_obj['token']['text']
        if result == '<|endoftext|>' then
          break
        elsif counts >= 50
        begin
          $bot.send_message(peer, 'limit reached!')
          break
        end
        elsif result.include?("\n")
        begin
          $bot.send_message(peer, b)
          sleep(0.3)
          counts += 1
          b = ''
        end
        else
          b += result
        end
      end

      $bot.send_message(peer, b)

    rescue StandardError => e
      if (e.to_s.start_with?("SSL_read"))
        retry
      end
      $bot.send_message(peer, e)
    end
  end
end

sender = Sender.new

IRCConnection.add_IO_socket(STDIN)
IRCEvent.add_callback('endofmotd') { |event| $bot.add_channel('#fpc') }

IRCEvent.add_callback('privmsg') {|event|

  if event.channel.eql?(BotNick)                      # pv message
  begin
    if (event.message.start_with?(".invite"))         # invite message
    begin
        event.message.slice! ".invite "
        $bot.add_channel(event.message)
    end
    else
      sender.Wait(event.from)
      #$bot.send_message(event.from, "I'm thinking...")
      sender.SendReq(event.from, event.message, '')
    end
  end
  else                                                # channel message
    if (event.message.start_with?("h2o"))
      sender.Wait(event.channel, event.from)
      #$bot.send_message(event.channel, "#{event.from}, I'm thinking...")
      sender.SendReq(event.channel, event.message.gsub(/#{"h2o "}\b/, ""), '')
    end
  end

}

$bot.connect