nakiircbot 0.0.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. checksums.yaml +5 -5
  2. data/lib/nakiircbot.rb +24 -18
  3. data/nakiircbot.gemspec +2 -2
  4. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d8ca18800562c7c0fd329e997bee46f5b27d8dba
4
- data.tar.gz: 20fa8cd1ceab4294bd91178fe65ebde49618d7ac
2
+ SHA256:
3
+ metadata.gz: a672981dae3300506bc3d7579009d6bc2ada58a1b38ed0b4afbc39d471de2a03
4
+ data.tar.gz: 72997bb910adc17459132b1deef79bec1015c8ea523e041931496d678594225c
5
5
  SHA512:
6
- metadata.gz: aeb84857a8086ec6cf62cc907968820aff82513b0795793c49b73567f47a18243a10130584e02086f34af04a35cfbe00c812f976e6d641db1779a090ada1a4d1
7
- data.tar.gz: '0081fc35339b93b87d2e08dd0b6ee5855df5675fc44fa3b8c9d33a0c8bdbfc5a9808225162aa1b3f3864e1adb61ca616984ff7fe97807877b7b2e7c1896ab2be'
6
+ metadata.gz: c6669d5ac757e78e7c0856722f36f132cb3d7a2bfa0efb30e0dab7711bbf89c9b6bea39d86bceca93268440449add073924749666960098833e31eed885efa03
7
+ data.tar.gz: 69df584be01ac7a4e3077bed9e2699d605f250747ab5ee1fac041b0051ab3abadc92a95600107e0b27c813be9b707a89c4bf8a9029dc14c2e96ea546210294bf
data/lib/nakiircbot.rb CHANGED
@@ -3,7 +3,7 @@ module NakiIRCBot
3
3
  # class << self
4
4
  # attr_accessor :channels
5
5
  # end
6
- def self.start server, port, bot_name, master_name, welcome001, *channels, password: nil, masterword: nil, processors: [], twitch: false
6
+ def self.start server, port, bot_name, master_name, welcome001, *channels, identity: nil, password: nil, masterword: nil, processors: [], tags: false
7
7
  # @@channels.replace channels.dup
8
8
 
9
9
  abort "matching bot_name and master_name may cause infinite recursion" if bot_name == master_name
@@ -33,33 +33,33 @@ module NakiIRCBot
33
33
  logger.info "> #{str}"
34
34
  socket.send str + "\n", 0
35
35
  end
36
- socket.send "PASS #{password.strip}\n", 0 if twitch
36
+ # socket.send "PASS #{password.strip}\n", 0 if twitch
37
+ socket_send.call "CAP REQ :sasl" if password
37
38
  socket_send.call "NICK #{bot_name}"
38
- socket_send.call "USER #{bot_name} #{bot_name} #{bot_name} #{bot_name}" unless twitch
39
+ socket_send.call "USER #{bot_name} #{bot_name} #{bot_name} #{bot_name}" #unless twitch
39
40
 
40
41
  queue = []
41
42
  prev_socket_time = prev_privmsg_time = Time.now
42
43
  loop do
43
44
  begin
44
45
  addr, msg = queue.shift
45
- next unless addr && msg
46
+ next unless addr && msg # TODO: how is it possible to have only one of them?
47
+ addr = addr.codepoints.pack("U*")
46
48
  fail "I should not PRIVMSG myself" if addr == bot_name
47
- msg.scrub!
48
- msg.gsub! "\n", " "
49
- msg.gsub! "\r", " "
49
+ msg = msg.to_s.codepoints.pack("U*").chomp[/^(\x01*)(.*)/m,2].gsub("\x00", "[NUL]").gsub("\x0A", "[LF]").gsub("\x0D", "[CR]")
50
50
  privmsg = "PRIVMSG #{addr} :#{msg}"
51
- privmsg = "PRIVMSG #{addr} :*flood*" if privmsg.bytes.size > 500 && addr.start_with?("#")
51
+ privmsg[-4..-1] = "..." until privmsg.bytesize <= 475
52
52
  prev_socket_time = prev_privmsg_time = Time.now
53
53
  socket_send.call privmsg
54
54
  break
55
- end until queue.empty? if prev_privmsg_time + 5 < Time.now
55
+ end until queue.empty? if prev_privmsg_time + 5 < Time.now || server == "localhost"
56
56
 
57
57
  unless _ = Kernel::select([socket], nil, nil, 1)
58
58
  break if Time.now - prev_socket_time > 300
59
59
  next
60
60
  end
61
61
  prev_socket_time = Time.now
62
- socket_str = _[0][0].gets(chomp: true)
62
+ socket_str = _[0][0].gets chomp: true
63
63
  break unless socket_str
64
64
  str = socket_str.force_encoding("utf-8").scrub
65
65
  if /\A:\S+ 372 /.match? str # MOTD
@@ -82,20 +82,26 @@ module NakiIRCBot
82
82
  # we join only when we are sure we are on the correct server
83
83
  # TODO: maybe abort if the server is wrong?
84
84
  next socket_send.call "JOIN #{channels.join ","}"
85
+
85
86
  when /\A:tmi.twitch.tv 001 #{Regexp.escape bot_name} :Welcome, GLHF!\z/
86
87
  socket_send.call "JOIN #{channels.join ","}"
87
88
  socket_send.call "CAP REQ :twitch.tv/membership twitch.tv/tags twitch.tv/commands"
88
89
  next
89
- when /\A:NickServ!NickServ@services\. NOTICE #{Regexp.escape bot_name} :This nickname is registered. Please choose a different nickname, or identify via \x02\/msg NickServ identify <password>\x02\.\z/
90
+ when /\A:NickServ!NickServ@services\. NOTICE #{Regexp.escape bot_name} :This nickname is registered. Please choose a different nickname, or identify via \x02\/msg NickServ identify <password>\x02\.\z/,
91
+ /\A:NickServ!NickServ@services\.libera\.chat NOTICE #{Regexp.escape bot_name} :This nickname is registered. Please choose a different nickname, or identify via \x02\/msg NickServ IDENTIFY #{Regexp.escape bot_name} <password>\x02\z/
90
92
  abort "no password" unless password
91
93
  logger.info "password"
92
- # next socket.send "PASS #{password.strip}\n", 0
93
94
  next socket.send "PRIVMSG NickServ :identify #{bot_name} #{password.strip}\n", 0
94
- # TODO: get rid of this Libera hard code
95
- when /\A:NickServ!NickServ@services\.libera\.chat NOTICE #{Regexp.escape bot_name} :This nickname is registered. Please choose a different nickname, or identify via \x02\/msg NickServ IDENTIFY #{Regexp.escape bot_name} <password>\x02\z/
96
- abort "no password" unless password
95
+ # when /\A:[a-z]+\.libera\.chat CAP \* LS :/
96
+ # next socket_send "CAP REQ :sasl" if $'.split.include? "sasl"
97
+ when /\A:[a-z]+\.libera\.chat CAP \* ACK :sasl\z/
98
+ next socket_send.call "AUTHENTICATE PLAIN"
99
+ when /\AAUTHENTICATE \+\z/
97
100
  logger.info "password"
98
- next socket.send "PRIVMSG NickServ :identify #{bot_name} #{password.strip}\n", 0
101
+ next socket.send "AUTHENTICATE #{Base64.strict_encode64 "\0#{identity || bot_name}\0#{password}"}\n", 0
102
+ when /\A:[a-z]+\.libera\.chat 903 #{bot_name} :SASL authentication successful\z/
103
+ next socket_send.call "CAP END"
104
+
99
105
  when /\APING :/
100
106
  next socket.send "PONG :#{$'}\n", 0 # Quakenet uses timestamp, Freenode and Twitch use server name
101
107
  when /\A:([^!]+)!\S+ PRIVMSG #{Regexp.escape bot_name} :\x01VERSION\x01\z/
@@ -104,7 +110,7 @@ module NakiIRCBot
104
110
  # socket_send.call "NOTICE",$1,"\001PING #{rand 10000000000}\001"
105
111
  # when /^:([^!]+)!\S+ PRIVMSG #{Regexp.escape bot_name} :\001TIME\001$/
106
112
  # socket_send.call "NOTICE",$1,"\001TIME 6:06:06, 6 Jun 06\001"
107
- when /\A#{'\S+ ' if twitch}:(?<who>[^!]+)!\S+ PRIVMSG (?<where>\S+) :(?<what>.+)/
113
+ when /\A#{'\S+ ' if tags}:(?<who>[^!]+)!\S+ PRIVMSG (?<where>\S+) :(?<what>.+)/
108
114
  next( if processors.empty?
109
115
  queue.push [master_name, "nothing to reload"]
110
116
  else
@@ -112,7 +118,7 @@ module NakiIRCBot
112
118
  queue.push [master_name, "reloading #{processor}"]
113
119
  load File.absolute_path processor
114
120
  end
115
- end ) if $~.named_captures == {"who"=>master_name, "where"=>bot_name, "what"=>"#{twitch ? "@#{bot_name} " : "#{masterword.strip} "}reload"}
121
+ end ) if $~.named_captures == {"who"=>master_name, "where"=>bot_name, "what"=>"#{masterword.strip} reload"}
116
122
  end
117
123
 
118
124
  begin
data/nakiircbot.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "nakiircbot"
3
- spec.version = "0.0.2"
3
+ spec.version = "0.1.4"
4
4
  spec.summary = "IRC bot framework"
5
5
 
6
6
  spec.author = "Victor Maslov aka Nakilon"
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.license = "MIT"
9
9
  spec.metadata = {"source_code_uri" => "https://github.com/nakilon/nakiircbot"}
10
10
 
11
- spec.required_ruby_version = ">=2.5" # for Exception#full_message and block rescue
11
+ spec.required_ruby_version = ">=2.5" # at least for Exception#full_message and block rescue
12
12
 
13
13
  spec.files = %w{ LICENSE nakiircbot.gemspec lib/nakiircbot.rb }
14
14
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nakiircbot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Maslov aka Nakilon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-20 00:00:00.000000000 Z
11
+ date: 2021-12-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: nakilon@gmail.com
@@ -40,7 +40,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
40
40
  version: '0'
41
41
  requirements: []
42
42
  rubyforge_project:
43
- rubygems_version: 2.5.2.3
43
+ rubygems_version: 2.7.6.2
44
44
  signing_key:
45
45
  specification_version: 4
46
46
  summary: IRC bot framework