mediawiki-butt 0.9.0 → 0.10.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +250 -0
- data/lib/mediawiki/auth.rb +4 -4
- data/lib/mediawiki/constants.rb +3 -0
- data/lib/mediawiki/edit.rb +2 -2
- data/lib/mediawiki/query/lists/all.rb +188 -0
- data/lib/mediawiki/query/lists/backlinks.rb +145 -0
- data/lib/mediawiki/query/lists/categories.rb +65 -0
- data/lib/mediawiki/query/lists/lists.rb +25 -0
- data/lib/mediawiki/query/lists/log/block.rb +83 -0
- data/lib/mediawiki/query/lists/log/delete.rb +59 -0
- data/lib/mediawiki/query/lists/log/import.rb +57 -0
- data/lib/mediawiki/query/lists/log/log.rb +372 -0
- data/lib/mediawiki/query/lists/log/merge.rb +33 -0
- data/lib/mediawiki/query/lists/log/move.rb +57 -0
- data/lib/mediawiki/query/lists/log/newusers.rb +82 -0
- data/lib/mediawiki/query/lists/log/patrol.rb +34 -0
- data/lib/mediawiki/query/lists/log/rights.rb +59 -0
- data/lib/mediawiki/query/lists/log/upload.rb +58 -0
- data/lib/mediawiki/query/lists/miscellaneous.rb +55 -0
- data/lib/mediawiki/query/lists/querypage.rb +203 -0
- data/lib/mediawiki/query/lists/recent_changes.rb +124 -0
- data/lib/mediawiki/query/lists/search.rb +86 -0
- data/lib/mediawiki/query/lists/users.rb +210 -0
- data/lib/mediawiki/query/query.rb +1 -1
- metadata +22 -3
- data/lib/mediawiki/query/lists.rb +0 -561
@@ -0,0 +1,145 @@
|
|
1
|
+
module MediaWiki
|
2
|
+
module Query
|
3
|
+
module Lists
|
4
|
+
module Backlinks
|
5
|
+
# Gets an array of backlinks to a given title, like
|
6
|
+
# Special:WhatLinksHere.
|
7
|
+
# @param title [String] The page to get the backlinks of.
|
8
|
+
# @param limit [Int] The maximum number of pages to get. Defaults to
|
9
|
+
# 500, and cannot be greater than that unless the user is a bot. If
|
10
|
+
# the user is a bot, the limit cannot be greater than 5000.
|
11
|
+
# @see https://www.mediawiki.org/wiki/API:Backlinks MediaWiki Backlinks
|
12
|
+
# API Docs
|
13
|
+
# @since 0.1.0
|
14
|
+
# @return [Array<String>] All backlinks until the limit
|
15
|
+
def what_links_here(title, limit = 500)
|
16
|
+
params = {
|
17
|
+
action: 'query',
|
18
|
+
list: 'backlinks',
|
19
|
+
bltitle: title,
|
20
|
+
bllimit: get_limited(limit)
|
21
|
+
}
|
22
|
+
|
23
|
+
ret = []
|
24
|
+
response = post(params)
|
25
|
+
response['query']['backlinks'].each { |bl| ret << bl['title'] }
|
26
|
+
|
27
|
+
ret
|
28
|
+
end
|
29
|
+
|
30
|
+
# Gets interwiki backlinks by the prefix and title.
|
31
|
+
# @param prefix [String] The wiki prefix, e.g., "mcw".
|
32
|
+
# @param title [String] The title of the page on that wiki.
|
33
|
+
# @param limit [Int] See #what_links_here.
|
34
|
+
# @see https://www.mediawiki.org/wiki/API:Iwbacklinks MediaWiki
|
35
|
+
# Iwbacklinks API Docs
|
36
|
+
# @since 0.10.0
|
37
|
+
# @return [Array<String>] All interwiki backlinking page titles.
|
38
|
+
def get_interwiki_backlinks(prefix = nil, title = nil, limit = 500)
|
39
|
+
params = {
|
40
|
+
action: 'query',
|
41
|
+
list: 'iwbacklinks',
|
42
|
+
iwbllimit: get_limited(limit)
|
43
|
+
}
|
44
|
+
params[:iwblprefix] = prefix unless prefix.nil?
|
45
|
+
params[:iwbltitle] = title unless title.nil?
|
46
|
+
|
47
|
+
ret = []
|
48
|
+
response = post(params)
|
49
|
+
response['query']['iwbacklinks'].each { |bl| ret << bl['title'] }
|
50
|
+
|
51
|
+
ret
|
52
|
+
end
|
53
|
+
|
54
|
+
# Gets language backlinks by the language and title.
|
55
|
+
# @param language [String] The language code
|
56
|
+
# @param title [String] The page title.
|
57
|
+
# @param limit [Int] See {#what_links_here}
|
58
|
+
# @see https://www.mediawiki.org/wiki/API:Langlinks MediaWiki Langlinks
|
59
|
+
# API Docs
|
60
|
+
# @since 0.10.0
|
61
|
+
# @return [Array<String>] All pages that link to the language links.
|
62
|
+
def get_language_backlinks(language = nil, title = nil, limit = 500)
|
63
|
+
language.downcase! if language.match(/[^A-Z]*/)[0].size == 0
|
64
|
+
params = {
|
65
|
+
action: 'query',
|
66
|
+
list: 'langbacklinks',
|
67
|
+
lbltitle: get_limited(limit)
|
68
|
+
}
|
69
|
+
params[:lbllang] = language unless language.nil?
|
70
|
+
params[:lbltitle] = title unless title.nil?
|
71
|
+
|
72
|
+
ret = []
|
73
|
+
response = post(params)
|
74
|
+
response['query']['langbacklinks'].each { |bl| ret << bl['title'] }
|
75
|
+
|
76
|
+
ret
|
77
|
+
end
|
78
|
+
|
79
|
+
# Gets image backlinks, or the pages that use a given image.
|
80
|
+
# @param title [String] The image.
|
81
|
+
# @param list_redirects [Nil/Boolean] Set to nil to list redirects and
|
82
|
+
# non-redirects. Set to true to only list redirects. Set to false to
|
83
|
+
# only list non-redirects.
|
84
|
+
# @param thru_redirect [Boolean] Whether to list pages that link to a
|
85
|
+
# redirect of the image.
|
86
|
+
# @param limit [Int] See {#what_links_here}
|
87
|
+
# @see https://www.mediawiki.org/wiki/API:Imageusage MediaWiki
|
88
|
+
# Imageusage API Docs
|
89
|
+
# @since 0.10.0
|
90
|
+
# @return [Array<String>] All page titles that fit the requirements.
|
91
|
+
def get_image_backlinks(title, list_redirects = nil, thru_redir = false,
|
92
|
+
limit = 500)
|
93
|
+
params = {
|
94
|
+
action: 'query',
|
95
|
+
list: 'imageusage',
|
96
|
+
iutitle: title,
|
97
|
+
iulimit: get_limited(limit)
|
98
|
+
}
|
99
|
+
|
100
|
+
params[:iufilterredir] = list_redirects.nil? ? 'all' : list_redirects
|
101
|
+
params[:iuredirect] = '1' if thru_redir
|
102
|
+
|
103
|
+
response = post(params)
|
104
|
+
ret = []
|
105
|
+
response['query']['imageusage'].each { |bl| ret << bl['title'] }
|
106
|
+
|
107
|
+
ret
|
108
|
+
end
|
109
|
+
|
110
|
+
# Gets all external link page titles.
|
111
|
+
# @param url [String] The URL to get backlinks for.
|
112
|
+
# @param limit [Int] See {#what_links_here}
|
113
|
+
# @see https://www.mediawiki.org/wiki/API:Exturlusage MediaWiki
|
114
|
+
# Exturlusage API Docs
|
115
|
+
# @since 0.10.0
|
116
|
+
# @return [Array<String>] All pages that link to the given URL.
|
117
|
+
# @return [Array<Hash>] All pages that link to any external links.
|
118
|
+
def get_url_backlinks(url = nil, limit = 500)
|
119
|
+
params = {
|
120
|
+
action: 'query',
|
121
|
+
list: 'exturlusage',
|
122
|
+
eulimit: get_limited(limit)
|
123
|
+
}
|
124
|
+
params[:euquery] = url unless url.nil?
|
125
|
+
|
126
|
+
response = post(params)
|
127
|
+
ret = []
|
128
|
+
response['query']['exturlusage'].each do |bl|
|
129
|
+
if url.nil?
|
130
|
+
hash = {
|
131
|
+
url: bl['url'],
|
132
|
+
title: bl['title']
|
133
|
+
}
|
134
|
+
ret << hash
|
135
|
+
else
|
136
|
+
ret << bl['title']
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
ret
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module MediaWiki
|
2
|
+
module Query
|
3
|
+
module Lists
|
4
|
+
module Categories
|
5
|
+
# Returns an array of all page titles that belong to a given category.
|
6
|
+
# By default, it will only get the pages. Files and subcategories can
|
7
|
+
# be gotten through {#get_subcategories} and {#get_files_in_category}
|
8
|
+
# or setting the type parameter.
|
9
|
+
# @param category [String] The category title. It can include
|
10
|
+
# "Category:", or not, it doesn't really matter because we will add it
|
11
|
+
# if it is missing.
|
12
|
+
# @param limit [Int] The maximum number of members to get. Defaults to
|
13
|
+
# 500, and cannot be greater than that unless the user is a bot.
|
14
|
+
# If the user is a bot, the limit cannot be greater than 5000.
|
15
|
+
# @param type [String] The type of stuff to get. There are 3 valid
|
16
|
+
# values: page, file, and subcat. Separate these with a pipe
|
17
|
+
# character, e.g., 'page|file|subcat'.
|
18
|
+
# @see https://www.mediawiki.org/wiki/API:Categorymembers MediaWiki
|
19
|
+
# Category Members API Docs
|
20
|
+
# @since 0.1.0
|
21
|
+
# @return [Array] All category members until the limit
|
22
|
+
def get_category_members(category, limit = 500, type = 'page')
|
23
|
+
params = {
|
24
|
+
action: 'query',
|
25
|
+
list: 'categorymembers',
|
26
|
+
cmprop: 'title',
|
27
|
+
cmlimit: get_limited(limit),
|
28
|
+
cmtype: type
|
29
|
+
}
|
30
|
+
|
31
|
+
if category =~ /[Cc]ategory\:/
|
32
|
+
params[:cmtitle] = category
|
33
|
+
else
|
34
|
+
params[:cmtitle] = "Category:#{category}"
|
35
|
+
end
|
36
|
+
ret = []
|
37
|
+
response = post(params)
|
38
|
+
response['query']['categorymembers'].each { |cm| ret << cm['title'] }
|
39
|
+
|
40
|
+
ret
|
41
|
+
end
|
42
|
+
|
43
|
+
# Gets the subcategories of a given category.
|
44
|
+
# @param category [String] See {#get_category_members}
|
45
|
+
# @param limit [Int] See {#get_category_members}
|
46
|
+
# @see {#get_category_members}
|
47
|
+
# @since 0.9.0
|
48
|
+
# @return [Array<String>] All subcategories.
|
49
|
+
def get_subcategories(category, limit = 500)
|
50
|
+
get_category_members(category, limit, 'subcat')
|
51
|
+
end
|
52
|
+
|
53
|
+
# Gets all of the files in a given category.
|
54
|
+
# @param category [String] See {#get_category_members}
|
55
|
+
# @param limit [Int] See {#get_category_members}
|
56
|
+
# @see {#get_category_members}
|
57
|
+
# @since 0.9.0
|
58
|
+
# @return [Array<String>] All files in the category.
|
59
|
+
def get_files_in_category(category, limit = 500)
|
60
|
+
get_category_members(category, limit, 'file')
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative '../../constants'
|
2
|
+
require_relative '../query'
|
3
|
+
require_relative 'backlinks'
|
4
|
+
require_relative 'categories'
|
5
|
+
require_relative 'all'
|
6
|
+
require_relative 'search'
|
7
|
+
require_relative 'miscellaneous'
|
8
|
+
require_relative 'log/log'
|
9
|
+
require_relative 'recent_changes'
|
10
|
+
require_relative 'querypage'
|
11
|
+
|
12
|
+
module MediaWiki
|
13
|
+
module Query
|
14
|
+
module Lists
|
15
|
+
include MediaWiki::Query::Lists::Backlinks
|
16
|
+
include MediaWiki::Query::Lists::Categories
|
17
|
+
include MediaWiki::Query::Lists::All
|
18
|
+
include MediaWiki::Query::Lists::Search
|
19
|
+
include MediaWiki::Query::Lists::Miscellaneous
|
20
|
+
include MediaWiki::Query::Lists::Log
|
21
|
+
include MediaWiki::Query::Lists::RecentChanges
|
22
|
+
include MediaWiki::Query::Lists::QueryPage
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require_relative '../../../constants'
|
2
|
+
|
3
|
+
module MediaWiki
|
4
|
+
module Query
|
5
|
+
module Lists
|
6
|
+
module Log
|
7
|
+
module Block
|
8
|
+
# Gets block/block logs.
|
9
|
+
# @param user [String] See {MediaWiki::Query::Lists::Log#get_log}
|
10
|
+
# @param title [String] See {MediaWiki::Query::Lists::Log#get_log}
|
11
|
+
# @param start [DateTime] See {MediaWiki::Query::Lists::Log#get_log}
|
12
|
+
# @param stop [DateTime] See {MediaWiki::Query::Lists::Log#get_log}
|
13
|
+
# @param limit [Int] See {MediaWiki::Query::Lists::Log#get_log}
|
14
|
+
# @see {MediaWiki::Query::Lists::Log#get_log}
|
15
|
+
# @see https://www.mediawiki.org/wiki/API:Logevents MediaWiki
|
16
|
+
# Logevents API Docs
|
17
|
+
# @since 0.10.0
|
18
|
+
# @return [Array<Hash>] The events, containing the following keys: id,
|
19
|
+
# blocked, flags, duration, expiry, blocker, comment, timestamp.
|
20
|
+
def get_block_log(user = nil, title = nil, start = nil, stop = nil,
|
21
|
+
limit = 500)
|
22
|
+
response = get_log('block/block', user, title, start, stop, limit)
|
23
|
+
|
24
|
+
ret = []
|
25
|
+
response['query']['logevents'].each do |log|
|
26
|
+
ret << get_blockblock(log)
|
27
|
+
end
|
28
|
+
|
29
|
+
ret
|
30
|
+
end
|
31
|
+
|
32
|
+
# Gets block/reblock logs.
|
33
|
+
# @param user [String] See {MediaWiki::Query::Lists::Log#get_log}
|
34
|
+
# @param title [String] See {MediaWiki::Query::Lists::Log#get_log}
|
35
|
+
# @param start [DateTime] See {MediaWiki::Query::Lists::Log#get_log}
|
36
|
+
# @param stop [DateTime] See {MediaWiki::Query::Lists::Log#get_log}
|
37
|
+
# @param limit [Int] See {MediaWiki::Query::Lists::Log#get_log}
|
38
|
+
# @see {MediaWiki::Query::Lists::Log#get_log}
|
39
|
+
# @see https://www.mediawiki.org/wiki/API:Logevents MediaWiki
|
40
|
+
# Logevents API Docs
|
41
|
+
# @since 0.10.0
|
42
|
+
# @return [Array<Hash>] The events, containing the following keys: id,
|
43
|
+
# blocked, flags, duration, expiry, blocker, comment, timestamp.
|
44
|
+
def get_reblock_log(user = nil, title = nil, start = nil, stop = nil,
|
45
|
+
limit = 500)
|
46
|
+
response = get_log('block/reblock', user, title, start, stop, limit)
|
47
|
+
|
48
|
+
ret = []
|
49
|
+
response['query']['logevents'].each do |log|
|
50
|
+
ret << get_blockreblock(log)
|
51
|
+
end
|
52
|
+
|
53
|
+
ret
|
54
|
+
end
|
55
|
+
|
56
|
+
# Gets block/unblock logs.
|
57
|
+
# @param user [String] See {MediaWiki::Query::Lists::Log#get_log}
|
58
|
+
# @param title [String] See {MediaWiki::Query::Lists::Log#get_log}
|
59
|
+
# @param start [DateTime] See {MediaWiki::Query::Lists::Log#get_log}
|
60
|
+
# @param stop [DateTime] See {MediaWiki::Query::Lists::Log#get_log}
|
61
|
+
# @param limit [Int] See {MediaWiki::Query::Lists::Log#get_log}
|
62
|
+
# @see {MediaWiki::Query::Lists::Log#get_log}
|
63
|
+
# @see https://www.mediawiki.org/wiki/API:Logevents MediaWiki
|
64
|
+
# Logevents API Docs
|
65
|
+
# @since 0.10.0
|
66
|
+
# @return [Array<Hash>] The events, containing the following keys: id,
|
67
|
+
# blocked, blocker, comment, timestamp.
|
68
|
+
def get_unblock_log(user = nil, title = nil, start = nil, stop = nil,
|
69
|
+
limit = 500)
|
70
|
+
response = get_log('block/unblock', user, title, start, stop, limit)
|
71
|
+
|
72
|
+
ret = []
|
73
|
+
response['query']['logevents'].each do |log|
|
74
|
+
ret << get_blockunblock(log)
|
75
|
+
end
|
76
|
+
|
77
|
+
ret
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module MediaWiki
|
2
|
+
module Query
|
3
|
+
module Lists
|
4
|
+
module Log
|
5
|
+
# @todo delete/event
|
6
|
+
# @todo delete/revision
|
7
|
+
module Delete
|
8
|
+
# Gets delete/delete logs.
|
9
|
+
# @param user [String] See {MediaWiki::Query::Lists::Log#get_log}
|
10
|
+
# @param title [String] See {MediaWiki::Query::Lists::Log#get_log}
|
11
|
+
# @param start [DateTime] See {MediaWiki::Query::Lists::Log#get_log}
|
12
|
+
# @param stop [DateTime] See {MediaWiki::Query::Lists::Log#get_log}
|
13
|
+
# @param limit [Int] See {MediaWiki::Query::Lists::Log#get_log}
|
14
|
+
# @see {MediaWiki::Query::Lists::Log#get_log}
|
15
|
+
# @see https://www.mediawiki.org/wiki/API:Logevents MediaWiki
|
16
|
+
# Logevents API Docs
|
17
|
+
# @since 0.10.0
|
18
|
+
# @return [Array<Hash>] The events, containing the following keys: id,
|
19
|
+
# title, user, comment, timestamp.
|
20
|
+
def get_delete_log(user = nil, title = nil, start = nil, stop = nil,
|
21
|
+
limit = 500)
|
22
|
+
response = get_log('delete/delete', user, title, start, stop, limit)
|
23
|
+
|
24
|
+
ret = []
|
25
|
+
response['query']['logevents'].each do |log|
|
26
|
+
ret << get_general(log)
|
27
|
+
end
|
28
|
+
|
29
|
+
ret
|
30
|
+
end
|
31
|
+
|
32
|
+
# Gets delete/restore logs.
|
33
|
+
# @param user [String] See {MediaWiki::Query::Lists::Log#get_log}
|
34
|
+
# @param title [String] See {MediaWiki::Query::Lists::Log#get_log}
|
35
|
+
# @param start [DateTime] See {MediaWiki::Query::Lists::Log#get_log}
|
36
|
+
# @param stop [DateTime] See {MediaWiki::Query::Lists::Log#get_log}
|
37
|
+
# @param limit [Int] See {MediaWiki::Query::Lists::Log#get_log}
|
38
|
+
# @see {MediaWiki::Query::Lists::Log#get_log}
|
39
|
+
# @see https://www.mediawiki.org/wiki/API:Logevents MediaWiki
|
40
|
+
# Logevents API Docs
|
41
|
+
# @since 0.10.0
|
42
|
+
# @return [Array<Hash>] The events, containing the following keys: id,
|
43
|
+
# title, user, comment, timestamp.
|
44
|
+
def get_deletion_restore_log(user = nil, title = nil, start = nil,
|
45
|
+
stop = nil, limit = 500)
|
46
|
+
resp = get_log('delete/restore', user, title, start, stop, limit)
|
47
|
+
|
48
|
+
ret = []
|
49
|
+
resp['query']['logevents'].each do |log|
|
50
|
+
ret << get_general(log)
|
51
|
+
end
|
52
|
+
|
53
|
+
ret
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module MediaWiki
|
2
|
+
module Query
|
3
|
+
module Lists
|
4
|
+
module Log
|
5
|
+
module Import
|
6
|
+
# Gets import/interwiki logs.
|
7
|
+
# @param user [String] See {MediaWiki::Query::Lists::Log#get_log}
|
8
|
+
# @param title [String] See {MediaWiki::Query::Lists::Log#get_log}
|
9
|
+
# @param start [DateTime] See {MediaWiki::Query::Lists::Log#get_log}
|
10
|
+
# @param stop [DateTime] See {MediaWiki::Query::Lists::Log#get_log}
|
11
|
+
# @param limit [Int] See {MediaWiki::Query::Lists::Log#get_log}
|
12
|
+
# @see {MediaWiki::Query::Lists::Log#get_log}
|
13
|
+
# @see https://www.mediawiki.org/wiki/API:Logevents MediaWiki
|
14
|
+
# Logevents API Docs
|
15
|
+
# @since 0.10.0
|
16
|
+
# @return [Array<Hash>] The events, containing the following keys: id,
|
17
|
+
# title, user, comment, timestamp, count, interwiki_title.
|
18
|
+
def get_interwiki_import_log(user = nil, title = nil, start = nil,
|
19
|
+
stop = nil, limit = 500)
|
20
|
+
resp = get_log('import/interwiki', user, title, start, stop, limit)
|
21
|
+
|
22
|
+
ret = []
|
23
|
+
resp['query']['logevents'].each do |log|
|
24
|
+
ret << get_importinterwiki(log)
|
25
|
+
end
|
26
|
+
|
27
|
+
ret
|
28
|
+
end
|
29
|
+
|
30
|
+
# Gets import/upload logs.
|
31
|
+
# @param user [String] See {MediaWiki::Query::Lists::Log#get_log}
|
32
|
+
# @param title [String] See {MediaWiki::Query::Lists::Log#get_log}
|
33
|
+
# @param start [DateTime] See {MediaWiki::Query::Lists::Log#get_log}
|
34
|
+
# @param stop [DateTime] See {MediaWiki::Query::Lists::Log#get_log}
|
35
|
+
# @param limit [Int] See {MediaWiki::Query::Lists::Log#get_log}
|
36
|
+
# @see {MediaWiki::Query::Lists::Log#get_log}
|
37
|
+
# @see https://www.mediawiki.org/wiki/API:Logevents MediaWiki
|
38
|
+
# Logevents API Docs
|
39
|
+
# @since 0.10.0
|
40
|
+
# @return [Array<Hash>] The events, containing the following keys: id,
|
41
|
+
# title, user, timestamp, comment.
|
42
|
+
def get_upload_import_log(user = nil, title = nil, start = nil,
|
43
|
+
stop = nil, limit = 500)
|
44
|
+
resp = get_log('import/upload', user, title, start, stop, limit)
|
45
|
+
|
46
|
+
ret = []
|
47
|
+
resp['query']['logevents'].each do |log|
|
48
|
+
ret << get_importupload(log)
|
49
|
+
end
|
50
|
+
|
51
|
+
ret
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,372 @@
|
|
1
|
+
require_relative '../../../constants'
|
2
|
+
require_relative 'block'
|
3
|
+
require_relative 'delete'
|
4
|
+
require_relative 'import'
|
5
|
+
require_relative 'merge'
|
6
|
+
require_relative 'move'
|
7
|
+
require_relative 'newusers'
|
8
|
+
require_relative 'patrol'
|
9
|
+
require_relative 'protect'
|
10
|
+
require_relative 'rights'
|
11
|
+
require_relative 'upload'
|
12
|
+
|
13
|
+
module MediaWiki
|
14
|
+
module Query
|
15
|
+
module Lists
|
16
|
+
module Log
|
17
|
+
include MediaWiki::Query::Lists::Log::Block
|
18
|
+
include MediaWiki::Query::Lists::Log::Delete
|
19
|
+
include MediaWiki::Query::Lists::Log::Import
|
20
|
+
include MediaWiki::Query::Lists::Log::Merge
|
21
|
+
include MediaWiki::Query::Lists::Log::Move
|
22
|
+
include MediaWiki::Query::Lists::Log::NewUsers
|
23
|
+
include MediaWiki::Query::Lists::Log::Patrol
|
24
|
+
include MediaWiki::Query::Lists::Log::Protect
|
25
|
+
include MediaWiki::Query::Lists::Log::Rights
|
26
|
+
include MediaWiki::Query::Lists::Log::Upload
|
27
|
+
|
28
|
+
# Gets the general log as seen in Special:Log. Since not every single
|
29
|
+
# log type possible can be supported, non-default MW logs will be
|
30
|
+
# represented exactly as provided by the API, with the :skipped key
|
31
|
+
# as true.
|
32
|
+
# @param user [String] See {#get_log}
|
33
|
+
# @param title [String] See {#get_log}
|
34
|
+
# @param start [DateTime] See {#get_log}
|
35
|
+
# @param stop [DateTime] See {#get_log}
|
36
|
+
# @param limit [Int] See {#get_log}
|
37
|
+
# @see {#get_log}
|
38
|
+
# @see https://www.mediawiki.org/wiki/API:Logevents MediaWiki Logevents
|
39
|
+
# API Docs
|
40
|
+
# @since 0.10.0
|
41
|
+
# @return [Array<Hash>] All the log events.
|
42
|
+
def get_overall_log(user = nil, title = nil, start = nil, stop = nil,
|
43
|
+
limit = 500)
|
44
|
+
time_format = MediaWiki::Constants::TIME_FORMAT
|
45
|
+
params = {
|
46
|
+
action: 'query',
|
47
|
+
list: 'logevents',
|
48
|
+
lelimit: get_limited(limit)
|
49
|
+
}
|
50
|
+
params[:leuser] = user unless user.nil?
|
51
|
+
params[:letitle] = title unless title.nil?
|
52
|
+
params[:lestart] = start.strftime(time_format) unless start.nil?
|
53
|
+
params[:leend] = stop.strftime(time_format) unless stop.nil?
|
54
|
+
response = post(params)
|
55
|
+
|
56
|
+
ret = []
|
57
|
+
response['query']['logevents'].each do |log|
|
58
|
+
case log['type']
|
59
|
+
when 'block'
|
60
|
+
case log['action']
|
61
|
+
when 'block'
|
62
|
+
hash = get_blockblock(log)
|
63
|
+
when 'unblock'
|
64
|
+
hash = get_blockunblock(log)
|
65
|
+
when 'reblock'
|
66
|
+
hash = get_blockreblock(log)
|
67
|
+
end
|
68
|
+
when 'delete'
|
69
|
+
case log['action']
|
70
|
+
when 'delete', 'restore'
|
71
|
+
hash = get_deletedelete(log)
|
72
|
+
end
|
73
|
+
when 'import'
|
74
|
+
case log['action']
|
75
|
+
when 'interwiki'
|
76
|
+
hash = get_importinterwiki(log)
|
77
|
+
when 'upload'
|
78
|
+
hash = get_importupload(log)
|
79
|
+
end
|
80
|
+
when 'merge'
|
81
|
+
case log['action']
|
82
|
+
when 'merge'
|
83
|
+
hash = get_mergemerge(log)
|
84
|
+
end
|
85
|
+
when 'move'
|
86
|
+
case log['action']
|
87
|
+
when 'move', 'move_redir'
|
88
|
+
hash = get_move(log)
|
89
|
+
end
|
90
|
+
when 'newusers'
|
91
|
+
case log['action']
|
92
|
+
when 'autocreate', 'create', 'create2'
|
93
|
+
hash = get_user(log)
|
94
|
+
end
|
95
|
+
when 'patrol'
|
96
|
+
case log['action']
|
97
|
+
when 'patrol'
|
98
|
+
hash = get_patrol(log)
|
99
|
+
end
|
100
|
+
when 'protect'
|
101
|
+
case log['action']
|
102
|
+
when 'modify', 'protect'
|
103
|
+
hash = get_protect(log)
|
104
|
+
when 'move_prot'
|
105
|
+
hash = get_protectmoveprot(log)
|
106
|
+
when 'unprotect'
|
107
|
+
hash = get_protectunprotect(log)
|
108
|
+
end
|
109
|
+
when 'rights'
|
110
|
+
case log['action']
|
111
|
+
when 'autopromote'
|
112
|
+
hash = get_rightsautopromote(log)
|
113
|
+
when 'rights'
|
114
|
+
hash = get_rightsrights(log)
|
115
|
+
end
|
116
|
+
when 'upload'
|
117
|
+
case log['action']
|
118
|
+
when 'overwrite', 'upload'
|
119
|
+
hash = get_upload(log)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
hash = log if hash.nil?
|
124
|
+
|
125
|
+
type = "#{log['type']}/#{log['action']}"
|
126
|
+
|
127
|
+
hash[:type] = type
|
128
|
+
hash[:skipped] = false unless hash.key(:skipped)
|
129
|
+
|
130
|
+
ret << hash
|
131
|
+
end
|
132
|
+
|
133
|
+
ret
|
134
|
+
end
|
135
|
+
|
136
|
+
private
|
137
|
+
|
138
|
+
# Gets log events.
|
139
|
+
# @param action [String] The action, e.g., block/block.
|
140
|
+
# @param user [String] The user to filter by.
|
141
|
+
# @param title [String] The title to filter by.
|
142
|
+
# @param start [DateTime] Where to start the log events at.
|
143
|
+
# @param stop [DateTime] Where to end the log events.
|
144
|
+
# @param limit [Int] The limit, maximum 500 for users or 5000 for bots.
|
145
|
+
# @see https://www.mediawiki.org/wiki/API:Logevents MediaWiki Logevents
|
146
|
+
# API Docs
|
147
|
+
# @since 0.10.0
|
148
|
+
# @return [JSON] The response json.
|
149
|
+
def get_log(action, user = nil, title = nil, start = nil, stop = nil,
|
150
|
+
limit = 500)
|
151
|
+
params = {
|
152
|
+
action: 'query',
|
153
|
+
list: 'logevents',
|
154
|
+
leaction: action,
|
155
|
+
lelimit: get_limited(limit)
|
156
|
+
}
|
157
|
+
params[:leuser] = user unless user.nil?
|
158
|
+
params[:letitle] = title unless title.nil?
|
159
|
+
params[:lestart] = start.strftime(MediaWiki::Constants::TIME_FORMAT) unless start.nil?
|
160
|
+
params[:leend] = stop.strftime(MediaWiki::Constants::TIME_FORMAT) unless stop.nil?
|
161
|
+
post(params)
|
162
|
+
end
|
163
|
+
|
164
|
+
def get_block(log)
|
165
|
+
{
|
166
|
+
id: log['logid'],
|
167
|
+
blocked: log['title'],
|
168
|
+
flags: log['block']['flags'],
|
169
|
+
duration: log['block']['duration'],
|
170
|
+
expiry: DateTime.strptime(log['block']['expiry'],
|
171
|
+
MediaWiki::Constants::TIME_FORMAT),
|
172
|
+
blocker: log['user'],
|
173
|
+
comment: log['comment'],
|
174
|
+
timestamp: DateTime.strptime(log['timestamp'],
|
175
|
+
MediaWiki::Constants::TIME_FORMAT)
|
176
|
+
}
|
177
|
+
end
|
178
|
+
|
179
|
+
def get_unblock(log)
|
180
|
+
{
|
181
|
+
id: log['logid'],
|
182
|
+
blocked: log['title'],
|
183
|
+
blocker: log['user'],
|
184
|
+
timestamp: DateTime.strptime(log['timestamp'],
|
185
|
+
MediaWiki::Constants::TIME_FORMAT),
|
186
|
+
comment: log['comment']
|
187
|
+
}
|
188
|
+
end
|
189
|
+
|
190
|
+
def get_importinterwiki(log)
|
191
|
+
{
|
192
|
+
id: log['logid'],
|
193
|
+
title: log['title'],
|
194
|
+
user: log['user'],
|
195
|
+
comment: log['comment'],
|
196
|
+
timestamp: DateTime.strptime(log['timestamp'],
|
197
|
+
MediaWiki::Constants::TIME_FORMAT),
|
198
|
+
count: log['params']['count'],
|
199
|
+
interwiki_title: log['params']['interwiki_title']
|
200
|
+
}
|
201
|
+
end
|
202
|
+
|
203
|
+
def get_general(log)
|
204
|
+
{
|
205
|
+
id: log['logid'],
|
206
|
+
title: log['title'],
|
207
|
+
user: log['user'],
|
208
|
+
timestamp: DateTime.strptime(log['timestamp'],
|
209
|
+
MediaWiki::Constants::TIME_FORMAT),
|
210
|
+
comment: log['comment']
|
211
|
+
}
|
212
|
+
end
|
213
|
+
|
214
|
+
def get_merge(log)
|
215
|
+
{
|
216
|
+
id: log['logid'],
|
217
|
+
title: log['title'],
|
218
|
+
user: log['user'],
|
219
|
+
comment: log['comment'],
|
220
|
+
destination_title: log['params']['dest_title'],
|
221
|
+
mergepoint: DateTime.strptime(log['params']['mergepoint'],
|
222
|
+
MediaWiki::Constants::TIME_FORMAT),
|
223
|
+
timestamp: DateTime.strptime(log['timestamp'],
|
224
|
+
MediaWiki::Constants::TIME_FORMAT)
|
225
|
+
}
|
226
|
+
end
|
227
|
+
|
228
|
+
def get_move(log)
|
229
|
+
hash = {
|
230
|
+
id: log['logid'],
|
231
|
+
timestamp: DateTime.strptime(log['timestamp'],
|
232
|
+
MediaWiki::Constants::TIME_FORMAT)
|
233
|
+
}
|
234
|
+
|
235
|
+
if log.key?('actionhidden')
|
236
|
+
hash[:hidden] = true
|
237
|
+
hash[:title] = nil
|
238
|
+
hash[:comment] = nil
|
239
|
+
hash[:suppressedredirect] = log.key('suppressed')
|
240
|
+
else
|
241
|
+
hash[:title] = log['title']
|
242
|
+
hash[:new_title] = log['move']['new_title']
|
243
|
+
hash[:user] = log['user']
|
244
|
+
hash[:comment] = log['comment']
|
245
|
+
|
246
|
+
hash[:suppressedredirect] = log['move'].key?('suppressedredirect')
|
247
|
+
end
|
248
|
+
|
249
|
+
hash
|
250
|
+
end
|
251
|
+
|
252
|
+
def get_user(log)
|
253
|
+
{
|
254
|
+
id: log['logid'],
|
255
|
+
new_user: log['title'],
|
256
|
+
user: log['user'],
|
257
|
+
comment: log['comment'],
|
258
|
+
timestamp: DateTime.strptime(log['timestamp'],
|
259
|
+
MediaWiki::Constants::TIME_FORMAT)
|
260
|
+
}
|
261
|
+
end
|
262
|
+
|
263
|
+
def get_patrol(log)
|
264
|
+
hash = {
|
265
|
+
id: log['logid'],
|
266
|
+
title: log['title'],
|
267
|
+
user: log['user'],
|
268
|
+
comment: log['comment'],
|
269
|
+
current_revision: log['patrol']['cur'],
|
270
|
+
previous_revision: log['patrol']['prev'],
|
271
|
+
timestamp: DateTime.strptime(log['timestamp'],
|
272
|
+
MediaWiki::Constants::TIME_FORMAT)
|
273
|
+
}
|
274
|
+
auto = log['patrol']['auto']
|
275
|
+
hash[:automatic] = auto == 1
|
276
|
+
|
277
|
+
hash
|
278
|
+
end
|
279
|
+
|
280
|
+
def get_protect(log)
|
281
|
+
time_format = MediaWiki::Constants::TIME_FORMAT
|
282
|
+
hash = {
|
283
|
+
id: log['logid'],
|
284
|
+
title: log['title'],
|
285
|
+
description: log['params']['description'],
|
286
|
+
user: log['user'],
|
287
|
+
comment: log['comment'],
|
288
|
+
timestamp: DateTime.strptime(log['timestamp'], time_format)
|
289
|
+
}
|
290
|
+
|
291
|
+
hash[:details] = []
|
292
|
+
|
293
|
+
log['params']['detail'].each do |detail|
|
294
|
+
details_hash = {
|
295
|
+
type: detail['type'],
|
296
|
+
level: detail['level']
|
297
|
+
}
|
298
|
+
expire = detail['expiry']
|
299
|
+
if expire != 'infinite'
|
300
|
+
details_hash[:expiry] = DateTime.strptime(expire, time_format)
|
301
|
+
end
|
302
|
+
hash[:details] << detail_hash
|
303
|
+
end
|
304
|
+
|
305
|
+
hash
|
306
|
+
end
|
307
|
+
|
308
|
+
def get_protectmoveprot(log)
|
309
|
+
{
|
310
|
+
id: log['logid'],
|
311
|
+
title: log['title'],
|
312
|
+
old_title: log['params']['oldtitle_title'],
|
313
|
+
user: log['user'],
|
314
|
+
comment: log['comment'],
|
315
|
+
timestamp: DateTime.strptime(log['timestamp'],
|
316
|
+
MediaWiki::Constants::TIME_FORMAT)
|
317
|
+
}
|
318
|
+
end
|
319
|
+
|
320
|
+
def get_protectunprotect(log)
|
321
|
+
{
|
322
|
+
id: log['logid'],
|
323
|
+
title: log['title'],
|
324
|
+
user: log['user'],
|
325
|
+
comment: log['comment'],
|
326
|
+
timestamp: DateTime.strptime(log['timestamp'],
|
327
|
+
MediaWiki::Constants::TIME_FORMAT)
|
328
|
+
}
|
329
|
+
end
|
330
|
+
|
331
|
+
def get_rightsautopromote(log)
|
332
|
+
{
|
333
|
+
id: log['logid'],
|
334
|
+
title: log['title'],
|
335
|
+
user: log['user'],
|
336
|
+
new_rights: log['rights']['new'].split(', '),
|
337
|
+
old_rights: log['rights']['old'].split(', '),
|
338
|
+
comment: log['comment'],
|
339
|
+
timestamp: DateTime.strptime(log['timestamp'],
|
340
|
+
MediaWiki::Constants::TIME_FORMAT)
|
341
|
+
}
|
342
|
+
end
|
343
|
+
|
344
|
+
def get_rightsrights(log)
|
345
|
+
{
|
346
|
+
id: log['logid'],
|
347
|
+
title: log['title'],
|
348
|
+
to: log['title'],
|
349
|
+
from: log['user'],
|
350
|
+
new_rights: log['rights']['new'].split(', '),
|
351
|
+
old_rights: log['rights']['old'].split(', '),
|
352
|
+
comment: log['comment'],
|
353
|
+
timestamp: DateTime.strptime(log['timestamp'],
|
354
|
+
MediaWiki::Constants::TIME_FORMAT)
|
355
|
+
}
|
356
|
+
end
|
357
|
+
|
358
|
+
def get_upload(log)
|
359
|
+
{
|
360
|
+
id: log['logid'],
|
361
|
+
title: log['title'],
|
362
|
+
user: log['user'],
|
363
|
+
sha: log['img_sha1'],
|
364
|
+
comment: log['comment'],
|
365
|
+
timestamp: DateTime.strptime(log['timestamp'],
|
366
|
+
MediaWiki::Constants::TIME_FORMAT)
|
367
|
+
}
|
368
|
+
end
|
369
|
+
end
|
370
|
+
end
|
371
|
+
end
|
372
|
+
end
|