rbmediawiki 0.2.2 → 0.2.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.
- data/Manifest.txt +7 -1
- data/lib/rbmediawiki.rb +6 -7
- data/lib/rbmediawiki/api.rb +917 -0
- data/lib/rbmediawiki/category.rb +37 -0
- data/lib/rbmediawiki/config.yml +4 -0
- data/lib/rbmediawiki/misc_generator.rb +51 -0
- data/lib/rbmediawiki/page.rb +465 -0
- data/lib/rbmediawiki/page_generator.rb +149 -0
- data/lib/rbmediawiki/user.rb +111 -0
- metadata +11 -5
- data/bin/rbmediawiki +0 -3
@@ -0,0 +1,149 @@
|
|
1
|
+
class Page_generator
|
2
|
+
def initialize(site)
|
3
|
+
@site = site
|
4
|
+
end
|
5
|
+
|
6
|
+
#gets pages alphabetically from a certain start point
|
7
|
+
# * from: starting point (Default starts from the beginning)
|
8
|
+
# * limit: pages to get per query (default: 500)
|
9
|
+
# * prefix: Only list titles that start with this value
|
10
|
+
# * namespace: The namespace to enumerate. By default, the main namespace will be enumerated
|
11
|
+
# * How to filter redirects
|
12
|
+
# * all: List all pages regardless of their redirect flag (default)
|
13
|
+
# * redirects: Only list redirects
|
14
|
+
# * nonredirects: Don't list redirects
|
15
|
+
# * minsize: Only list pages that are at least this many bytes in size
|
16
|
+
# * maxsize: Only list pages that are at most this many bytes in size
|
17
|
+
# * prtype: Only list pages that have been protected from this type of action
|
18
|
+
# * edit: Only list edit-protected pages
|
19
|
+
# * move: Only list move-protected pages
|
20
|
+
# * prleve: Only list pages that have been protected at this level. Cannot be used without prtype
|
21
|
+
# * autoconfirmed: Only autoconfirmed users can edit/move/whatever
|
22
|
+
# * sysop: Only sysops can edit/move/whatever
|
23
|
+
# * Empty: Everyone can edit/move/whatever
|
24
|
+
# * prfiltercascade: Filter protections based on cascadingness (ignored when apprtype isn't set)
|
25
|
+
# * One value: cascading, noncascading, all
|
26
|
+
# * Default: all
|
27
|
+
# *filterlanglinks: Filter based on whether a page has langlinks
|
28
|
+
# * One value: withlanglinks, withoutlanglinks, all
|
29
|
+
# * Default: all
|
30
|
+
def all_pages(from = "!", limit = "500", prefix = nil, namespace = nil, filterredir = nil, minsize = nil, maxsize = nil, prtype = nil, prlevel = nil, prfiltercascade = nil, filterlanglinks = nil)
|
31
|
+
pages = Hash.new
|
32
|
+
count = 0
|
33
|
+
finish = false
|
34
|
+
while !finish
|
35
|
+
result = @site.query_list_allpages(nil, from, prefix, namespace, filterredir, minsize, maxsize, prtype, prlevel, prfiltercascade, limit, nil, filterlanglinks)
|
36
|
+
result['query']['allpages']['p'].each {|page|
|
37
|
+
yield Page.new(page['title'], @site)
|
38
|
+
}
|
39
|
+
if result.key?('query-continue')
|
40
|
+
from = result['query-continue']['allpages']['apfrom']
|
41
|
+
else
|
42
|
+
finish = true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def linksearch(euquery, eulimit = 500, eunamespace = 0)
|
48
|
+
pages = Hash.new
|
49
|
+
count = 0
|
50
|
+
finish = false
|
51
|
+
euoffset = nil
|
52
|
+
while !finish
|
53
|
+
result = @site.query_list_exturlusage(nil, nil, euoffset, nil, euquery, eunamespace, eulimit)
|
54
|
+
result['query']['exturlusage']['eu'].each {|page|
|
55
|
+
yield Page.new(page['title'], @site)
|
56
|
+
}
|
57
|
+
if result.key?('query-continue')
|
58
|
+
euoffset = result['query-continue']['exturlusage']['euoffset']
|
59
|
+
else
|
60
|
+
finish = true
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
#Returns pages where eititle is transcluded in.
|
66
|
+
#eilimit is the max results for query (default: 500)
|
67
|
+
#einamespace is the namespace to work in
|
68
|
+
def templateusage(eititle, eilimit = 500, einamespace = nil)
|
69
|
+
pages = Hash.new
|
70
|
+
finish = false
|
71
|
+
eioffset = nil
|
72
|
+
while !finish
|
73
|
+
result = @site.query_list_embeddedin(nil, eititle, eioffset, einamespace, nil, eilimit)
|
74
|
+
result['query']['embeddedin']['ei'].each {|page|
|
75
|
+
yield Page.new(page['title'], @site)
|
76
|
+
}
|
77
|
+
if result.key?('query-continue')
|
78
|
+
eioffset = result['query-continue']['embeddedin']['eicontinue']
|
79
|
+
else
|
80
|
+
finish = true
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
def alllinks(alprefix, allimit = 500, alnamespace = nil)
|
85
|
+
pages = Hash.new
|
86
|
+
finish = false
|
87
|
+
aloffset = nil
|
88
|
+
while !finish
|
89
|
+
result = @site.query_list_alllinks(nil, aloffset, nil, alprefix, nil, nil, nil, alnamespace, allimit, nil, nil, true)
|
90
|
+
result['query']['alllinks']['l'].each {|page|
|
91
|
+
yield Page.new(page['title'], @site)
|
92
|
+
}
|
93
|
+
if result.key?('query-continue')
|
94
|
+
euoffset = result['query-continue']['alllinks']['alcontinue']
|
95
|
+
else
|
96
|
+
finish = true
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
def backlinks(bltitle, bllimit = 500, blnamespace = nil, blfilterredir = nil)
|
101
|
+
pages = Hash.new
|
102
|
+
finish = false
|
103
|
+
bloffset = nil
|
104
|
+
while !finish
|
105
|
+
result = @site.query_list_backlinks(nil, bltitle, bloffset, blnamespace, blfilterredir, bllimit, true )
|
106
|
+
result['query']['backlinks']['bl'].each {|page|
|
107
|
+
if page.key?('redirect')
|
108
|
+
page['redirlinks']['bl'].each {|page2|
|
109
|
+
yield Page.new(page2['title'], @site)
|
110
|
+
}
|
111
|
+
else
|
112
|
+
yield Page.new(page['title'], @site)
|
113
|
+
end
|
114
|
+
}
|
115
|
+
if result.key?('query-continue')
|
116
|
+
euoffset = result['query-continue']['backlinks']['blcontinue']
|
117
|
+
else
|
118
|
+
finish = true
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
#TODO
|
125
|
+
#opensearch
|
126
|
+
#prop links
|
127
|
+
#prop langlinks?
|
128
|
+
#prop images
|
129
|
+
#prop templates
|
130
|
+
#prop categories
|
131
|
+
#prop extlinks
|
132
|
+
#list allimages
|
133
|
+
#list allcategories
|
134
|
+
#list allusers
|
135
|
+
#list blocks
|
136
|
+
#list categorymembers
|
137
|
+
#list deletedrevs
|
138
|
+
#list imageusage
|
139
|
+
#list logevents
|
140
|
+
#list recentchanges
|
141
|
+
#list search
|
142
|
+
#list usercontribs
|
143
|
+
#list watchlist
|
144
|
+
#list exturlusage
|
145
|
+
#list users
|
146
|
+
#list random
|
147
|
+
#list protectedtitles
|
148
|
+
#list globalblocks
|
149
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
#coding: utf-8
|
2
|
+
|
3
|
+
class User
|
4
|
+
attr_reader :name
|
5
|
+
def initialize(name = nil, site = nil)
|
6
|
+
@username = name.gsub(" ","_")
|
7
|
+
@site = site
|
8
|
+
end
|
9
|
+
|
10
|
+
#blocks the user with the given reason
|
11
|
+
#the params are the usual block options
|
12
|
+
def block(expiry, reason, anononly = true, nocreate = true, autoblock = true, noemail = false, allowusertalk = true, reblock = false)
|
13
|
+
#require login
|
14
|
+
@site.login
|
15
|
+
result = @site.query_prop_info(@username, nil, 'block')
|
16
|
+
token = result['query']['pages']['page']['blocktoken']
|
17
|
+
result = @site.block(@username, token, nil, expiry, reason, anononly, nocreate, autoblock, noemail, nil, allowusertalk, reblock)
|
18
|
+
if result.key?('error')
|
19
|
+
raise RbykimediaError, "#{@username}: "+result['error']['code']
|
20
|
+
else
|
21
|
+
return true
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
#unblocks the user
|
26
|
+
def unblock(reason)
|
27
|
+
#require login
|
28
|
+
@site.login
|
29
|
+
result = @site.query_prop_info(@username, nil, 'unblock')
|
30
|
+
token = result['query']['pages']['page']['unblocktoken']
|
31
|
+
result = @site.unblock(nil, @username, token, nil, reason)
|
32
|
+
if result.key?('error')
|
33
|
+
raise RbykimediaError, "#{@username}: "+result['error']['code']
|
34
|
+
else
|
35
|
+
return true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
#write a message in the user's talk page
|
40
|
+
def write_msg(msg, summary = nil)
|
41
|
+
page = Page.new("User talk:"+@username, @site)
|
42
|
+
return page.append(msg, summary, false)
|
43
|
+
end
|
44
|
+
|
45
|
+
#write an email to the user
|
46
|
+
def write_email(subject, text, ccme = nil)
|
47
|
+
#require login
|
48
|
+
@site.login
|
49
|
+
result = @site.query_prop_info(@username, nil, 'email')
|
50
|
+
puts result
|
51
|
+
token = result['query']['pages']['page']['emailtoken']
|
52
|
+
result = @site.emailuser(@username, subject, text, token, ccme)
|
53
|
+
if result.key?('error')
|
54
|
+
raise RbykimediaError, "#{@username}: "+result['error']['code']
|
55
|
+
else
|
56
|
+
return true
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
#info about the user
|
61
|
+
def info
|
62
|
+
result = @site.query_list_users(nil, "blockinfo|groups|editcount|registration|emailable", @username)
|
63
|
+
if result.key?('error')
|
64
|
+
raise RbykimediaError, "#{@username}: "+result['error']['code']
|
65
|
+
else
|
66
|
+
return result
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
#get user contributions
|
71
|
+
#returns false if there aren't any
|
72
|
+
def get_usercontribs(uclimit = 500, ucstart = nil, ucnamespace = nil)
|
73
|
+
uccontinue = nil
|
74
|
+
ucs = Hash.new
|
75
|
+
puts ucstart
|
76
|
+
loop {
|
77
|
+
result = @site.query_list_usercontribs(nil, uclimit, ucstart, nil, uccontinue, @username, nil, "newer", ucnamespace)
|
78
|
+
ucs.deep_merge!(result['query'])
|
79
|
+
if result.key?('query-continue')
|
80
|
+
ucstart = result['query-continue']['usercontribs']['ucstart']
|
81
|
+
else
|
82
|
+
break
|
83
|
+
end
|
84
|
+
}
|
85
|
+
if ucs['usercontribs'].key?('item')
|
86
|
+
return ucs['usercontribs']['item']
|
87
|
+
else
|
88
|
+
return false
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
#rollbacks (reverts) all edits by the user since a given time.
|
93
|
+
#"since" is a timestamp. Default will rollback everything.
|
94
|
+
#"namespace", if set, restricts the rollback to the given namespace
|
95
|
+
def rollback(since = nil, namespace = nil)
|
96
|
+
contribs = get_usercontribs(nil, since, nil)
|
97
|
+
array_c = Array.new
|
98
|
+
puts array_c
|
99
|
+
contribs.each{|c| array_c.push(c['title'])}
|
100
|
+
array_c.uniq!
|
101
|
+
puts array_c
|
102
|
+
array_c.each{|p|
|
103
|
+
page = Page.new(p, @site)
|
104
|
+
begin
|
105
|
+
page.rollback(@username, "desde aquí", false)
|
106
|
+
rescue RbykimediaError => error
|
107
|
+
puts error
|
108
|
+
end
|
109
|
+
}
|
110
|
+
end
|
111
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbmediawiki
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chabacano
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-05-
|
12
|
+
date: 2009-05-24 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -25,8 +25,8 @@ dependencies:
|
|
25
25
|
description: Framework for developing bots and mediawiki tools in ruby.
|
26
26
|
email:
|
27
27
|
- Chabacano@chabawiki.com
|
28
|
-
executables:
|
29
|
-
|
28
|
+
executables: []
|
29
|
+
|
30
30
|
extensions: []
|
31
31
|
|
32
32
|
extra_rdoc_files:
|
@@ -38,8 +38,14 @@ files:
|
|
38
38
|
- Manifest.txt
|
39
39
|
- README.txt
|
40
40
|
- Rakefile
|
41
|
-
- bin/rbmediawiki
|
42
41
|
- lib/rbmediawiki.rb
|
42
|
+
- lib/rbmediawiki/api.rb
|
43
|
+
- lib/rbmediawiki/category.rb
|
44
|
+
- lib/rbmediawiki/config.yml
|
45
|
+
- lib/rbmediawiki/misc_generator.rb
|
46
|
+
- lib/rbmediawiki/page.rb
|
47
|
+
- lib/rbmediawiki/page_generator.rb
|
48
|
+
- lib/rbmediawiki/user.rb
|
43
49
|
- test/test_rbmediawiki.rb
|
44
50
|
has_rdoc: true
|
45
51
|
homepage: http://rbmediawiki.rubyforge.com
|
data/bin/rbmediawiki
DELETED