cinch-links-logger 0.0.1 → 1.0.0
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.
- data/.travis.yml +4 -0
- data/README.md +6 -0
- data/Rakefile +6 -0
- data/cinch-links-logger.gemspec +10 -3
- data/lib/cinch/plugins/links-logger/links-logger.rb +42 -73
- data/lib/cinch/plugins/links-logger/version.rb +1 -1
- data/spec/cinch-links-logger_spec.rb +30 -0
- data/spec/spec_helper.rb +4 -0
- metadata +115 -14
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# Cinch::Plugins::LinksLogger
|
2
2
|
|
3
|
+
[](http://badge.fury.io/rb/cinch-links-logger)
|
4
|
+
[](https://gemnasium.com/bhaberer/cinch-links-logger)
|
5
|
+
[](https://travis-ci.org/bhaberer/cinch-links-logger)
|
6
|
+
[](https://coveralls.io/r/bhaberer/cinch-links-logger?branch=master)
|
7
|
+
[](https://codeclimate.com/github/bhaberer/cinch-links-logger)
|
8
|
+
|
3
9
|
Cinch Plugin for logging links and printing titles / stats for linked urls.
|
4
10
|
|
5
11
|
## Installation
|
data/Rakefile
CHANGED
data/cinch-links-logger.gemspec
CHANGED
@@ -17,7 +17,14 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
18
|
gem.require_paths = ["lib"]
|
19
19
|
|
20
|
-
gem.
|
21
|
-
gem.
|
22
|
-
gem.
|
20
|
+
gem.add_development_dependency 'rake'
|
21
|
+
gem.add_development_dependency 'rspec'
|
22
|
+
gem.add_development_dependency 'coveralls'
|
23
|
+
gem.add_development_dependency 'cinch-test'
|
24
|
+
|
25
|
+
gem.add_dependency 'cinch', '~> 2.0.5'
|
26
|
+
gem.add_dependency 'cinch-cooldown', '~> 1.0.0'
|
27
|
+
gem.add_dependency 'cinch-storage', '~> 1.0.1'
|
28
|
+
gem.add_dependency 'cinch-toolbox', '~> 1.0.3'
|
29
|
+
gem.add_dependency 'time-lord', '~> 1.0.1'
|
23
30
|
end
|
@@ -1,12 +1,20 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require 'open-uri'
|
3
|
+
require 'cinch'
|
4
|
+
require 'cinch/toolbox'
|
3
5
|
require 'cinch-storage'
|
4
|
-
require 'cinch-toolbox'
|
5
6
|
require 'time-lord'
|
6
7
|
|
8
|
+
class Link < Struct.new(:nick, :title, :count, :short_url, :time)
|
9
|
+
def to_yaml
|
10
|
+
{nick: nick, title: title, count: count, short_url: short_url, time: time }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
7
14
|
module Cinch::Plugins
|
8
15
|
class LinksLogger
|
9
16
|
include Cinch::Plugin
|
17
|
+
attr_reader :storage
|
10
18
|
|
11
19
|
listen_to :channel
|
12
20
|
|
@@ -17,94 +25,55 @@ module Cinch::Plugins
|
|
17
25
|
def initialize(*args)
|
18
26
|
super
|
19
27
|
@storage = CinchStorage.new(config[:filename] || 'yaml/links.yaml')
|
20
|
-
@storage.data
|
21
|
-
@post_titles = config[:titles].nil? ? true : config[:titles]
|
22
|
-
@post_stats = config[:stats].nil? ? true : config[:stats]
|
28
|
+
@storage.data ||= Hash.new
|
23
29
|
end
|
24
30
|
|
25
31
|
def execute(m)
|
26
|
-
if
|
27
|
-
|
28
|
-
return
|
29
|
-
end
|
30
|
-
|
31
|
-
m.user.send "Recent Links in #{m.channel}"
|
32
|
-
last = @storage.data[:history][m.channel.name].values.sort {|a,b| b[:time] <=> a[:time] }
|
33
|
-
last[0,10].each_with_index do |link, i|
|
34
|
-
msg = "#{i + 1} - "
|
35
|
-
if link[:title].nil?
|
36
|
-
msg << Cinch::Toolbox.expand(@link[:short_url])
|
37
|
-
else
|
38
|
-
msg << "#{link[:short_url]} ∴ #{link[:title]}"
|
39
|
-
end
|
40
|
-
m.user.send msg
|
41
|
-
end
|
32
|
+
return if Cinch::Toolbox.sent_via_private_message?(m)
|
33
|
+
get_recent_links(m.channel.name).each { |line| m.user.send line }
|
42
34
|
end
|
43
35
|
|
44
36
|
def listen(m)
|
45
37
|
urls = URI.extract(m.message, ["http", "https"])
|
46
38
|
urls.each do |url|
|
47
39
|
# Ensure we have a Channel Object in the History to dump links into.
|
48
|
-
@storage.data[
|
49
|
-
|
50
|
-
# Make sure it conforms to white/black lists before bothering.
|
51
|
-
if whitelisted?(url) && !blacklisted?(url)
|
52
|
-
# If the link was posted already, get the old info instead of getting new
|
53
|
-
if @storage.data[:history][m.channel.name].key?(url)
|
54
|
-
@storage.data[:history][m.channel.name][url][:count] += 1
|
55
|
-
@link = @storage.data[:history][m.channel.name][url]
|
56
|
-
else
|
57
|
-
@link = { :nick => m.user.nick,
|
58
|
-
:title => Cinch::Toolbox.get_page_title(url) || nil,
|
59
|
-
:count => 1,
|
60
|
-
:short_url => Cinch::Toolbox.shorten(url),
|
61
|
-
:time => Time.now }
|
62
|
-
@storage.data[:history][m.channel.name][url] = @link
|
63
|
-
end
|
64
|
-
else
|
65
|
-
debug "#{blacklisted?(url) ? 'Blacklisted URL was not logged' : 'Domain not Whitelisted'} #{url}"
|
66
|
-
return
|
67
|
-
end
|
68
|
-
|
69
|
-
# Check to see if we should post titles
|
70
|
-
if @post_titles
|
71
|
-
# Only spam the channel if you have a title
|
72
|
-
unless @link[:title].nil?
|
73
|
-
m.reply "#{@link[:short_url] || url} ∴ #{@link[:title]}"
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
# Check to see if we should post stats and if it'ss been linked more than once.
|
78
|
-
if @post_stats && @link[:count] > 1
|
79
|
-
# No stats if this person was the first one to link it
|
80
|
-
unless @link[:nick] == m.user.nick
|
81
|
-
m.reply "That was already linked by #{@link[:nick]} #{@link[:time].ago.to_words}.", true
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
# Don't save unless we found some urls to process
|
87
|
-
if urls
|
88
|
-
synchronize(:save_links) do
|
89
|
-
@storage.save
|
90
|
-
end
|
40
|
+
@storage.data[m.channel.name] ||= Hash.new
|
41
|
+
@link = get_or_create_link(m, url)
|
91
42
|
end
|
43
|
+
# Save if we matched urls.
|
44
|
+
@storage.synced_save(@bot) if urls
|
92
45
|
end
|
93
46
|
|
94
47
|
private
|
95
48
|
|
96
|
-
def
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
49
|
+
def get_or_create_link(m, url)
|
50
|
+
channel = m.channel.name
|
51
|
+
# If the link was posted already, get the old info instead of getting new
|
52
|
+
if @storage.data[channel].key?(url)
|
53
|
+
@storage.data[channel][url][:count] += 1
|
54
|
+
link = @storage.data[channel][url]
|
55
|
+
else
|
56
|
+
link = Link.new(m.user.nick,
|
57
|
+
Cinch::Toolbox.get_page_title(url),
|
58
|
+
1, Cinch::Toolbox.shorten(url), Time.now)
|
59
|
+
@storage.data[channel][url] = link
|
60
|
+
end
|
61
|
+
return link
|
101
62
|
end
|
102
63
|
|
103
|
-
def
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
64
|
+
def get_recent_links(channel)
|
65
|
+
message = ["Recent Links in #{channel}"]
|
66
|
+
links = @storage.data[channel].values.reverse[0..9]
|
67
|
+
puts links.to_s
|
68
|
+
puts message
|
69
|
+
links.each_with_index do |link|
|
70
|
+
message << if link.title.nil?
|
71
|
+
Cinch::Toolbox.expand(link.short_url)
|
72
|
+
else
|
73
|
+
"#{link.short_url} - #{link.title}"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
return message
|
108
77
|
end
|
109
78
|
end
|
110
79
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Cinch::Plugins::LinksLogger do
|
5
|
+
include Cinch::Test
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@bot = make_bot(Cinch::Plugins::LinksLogger, { :filename => '/dev/null' })
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should capture links' do
|
12
|
+
get_replies(make_message(@bot, 'http://github.com', { channel: '#foo', nick: 'bar' }))
|
13
|
+
@bot.plugins.first.storage.data['#foo'].keys.first.
|
14
|
+
should == 'http://github.com'
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should not capture malformed URLS' do
|
18
|
+
get_replies(make_message(@bot, 'htp://github.com', { channel: '#foo', nick: 'bar' }))
|
19
|
+
get_replies(make_message(@bot, 'http/github.com', { channel: '#foo', nick: 'bar' }))
|
20
|
+
@bot.plugins.first.storage.data['#foo'].
|
21
|
+
should be_nil
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should allow users to get a list of recently linked URLS' do
|
25
|
+
get_replies(make_message(@bot, 'http://github.com', { channel: '#foo', nick: 'bar' }))
|
26
|
+
replies = get_replies(make_message(@bot, '!links', { channel: '#foo', nick: 'test' }))
|
27
|
+
replies.first.text.should == 'Recent Links in #foo'
|
28
|
+
replies.last.text.should == 'http://github.com - GitHub · Build software better, together.'
|
29
|
+
end
|
30
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cinch-links-logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,46 +9,110 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-07-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: rake
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0
|
22
|
-
type: :
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0
|
29
|
+
version: '0'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
|
-
name:
|
31
|
+
name: rspec
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
none: false
|
34
34
|
requirements:
|
35
35
|
- - ! '>='
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: 0
|
38
|
-
type: :
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
43
|
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: 0
|
45
|
+
version: '0'
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
|
-
name:
|
47
|
+
name: coveralls
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: cinch-test
|
48
64
|
requirement: !ruby/object:Gem::Requirement
|
49
65
|
none: false
|
50
66
|
requirements:
|
51
67
|
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: cinch
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 2.0.5
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 2.0.5
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: cinch-cooldown
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 1.0.0
|
102
|
+
type: :runtime
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 1.0.0
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: cinch-storage
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
52
116
|
- !ruby/object:Gem::Version
|
53
117
|
version: 1.0.1
|
54
118
|
type: :runtime
|
@@ -56,7 +120,39 @@ dependencies:
|
|
56
120
|
version_requirements: !ruby/object:Gem::Requirement
|
57
121
|
none: false
|
58
122
|
requirements:
|
59
|
-
- -
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.0.1
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: cinch-toolbox
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ~>
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 1.0.3
|
134
|
+
type: :runtime
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 1.0.3
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: time-lord
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ~>
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 1.0.1
|
150
|
+
type: :runtime
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ~>
|
60
156
|
- !ruby/object:Gem::Version
|
61
157
|
version: 1.0.1
|
62
158
|
description: Cinch Plugin to track links in the channel
|
@@ -67,6 +163,7 @@ extensions: []
|
|
67
163
|
extra_rdoc_files: []
|
68
164
|
files:
|
69
165
|
- .gitignore
|
166
|
+
- .travis.yml
|
70
167
|
- Gemfile
|
71
168
|
- LICENSE.txt
|
72
169
|
- README.md
|
@@ -75,6 +172,8 @@ files:
|
|
75
172
|
- lib/cinch-links-logger.rb
|
76
173
|
- lib/cinch/plugins/links-logger/links-logger.rb
|
77
174
|
- lib/cinch/plugins/links-logger/version.rb
|
175
|
+
- spec/cinch-links-logger_spec.rb
|
176
|
+
- spec/spec_helper.rb
|
78
177
|
homepage: https://github.com/bhaberer/cinch-links-logger
|
79
178
|
licenses: []
|
80
179
|
post_install_message:
|
@@ -95,8 +194,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
95
194
|
version: '0'
|
96
195
|
requirements: []
|
97
196
|
rubyforge_project:
|
98
|
-
rubygems_version: 1.8.
|
197
|
+
rubygems_version: 1.8.25
|
99
198
|
signing_key:
|
100
199
|
specification_version: 3
|
101
200
|
summary: Cinch Plugin for links logging
|
102
|
-
test_files:
|
201
|
+
test_files:
|
202
|
+
- spec/cinch-links-logger_spec.rb
|
203
|
+
- spec/spec_helper.rb
|