Script to welcome new users. This script works out of the box for Wikis that
have been defined in the script. It is currently used on the Dutch, Norwegian,
Arabian, Albanian, Italian Wikipedia, Wikimedia Commons and English Wikiquote.
Everything that needs customisation to support additional projects is
indicated by comments.
Description of basic functionality:
Request a list of new users every period (default: 3600 seconds)
You can choose to break the script after the first check (see arguments)
Check if new user has passed a threshold for a number of edits
(default: 1 edit)
Optional: check username for bad words in the username or if the username
consists solely of numbers; log this somewhere on the wiki (default: False)
Update: Added a whitelist (explanation below).
If user has made enough edits (it can be also 0), check if user has an empty
talk page
If user has an empty talk page, add a welcome message.
Optional: Once the set number of users have been welcomed, add this to the
configured log page, one for each day (default: True)
If no log page exists, create a header for the log page first.
This script (by default not yet implemented) uses two templates that need to
be on the local wiki:
|--
|[[User:{{{user}}}|{{{user}}}]] ( [[User talk:{{{user}}}|留言]] | [[Special:Contributions/{{{user}}}|贡献]] | 画廊 | PFC画廊 ) || {{{contribs}}}: contains mark up code for log entries (just copy it from Commons)
Welcome! If you can't understand Chinese, please feel free to ask or request anything here. Thank you for visiting!
歡迎您的維基人是:~~~~: contains the information for new users
This script understands the following command-line arguments:
-edit[:#] Define how many edits a new user needs to be welcomed
(default: 1)
-time[:#] Define how many seconds the bot sleeps before restart
(default: 3600)
-break Use it if you don't want that the Bot restart at the end
(it will break) (default: False)
-nlog Use this parameter if you do not want the bot to log all
welcomed users (default: False)
-limit[:#] Use this parameter to define how may users should be
checked (default:50)
-offset[:#] Skip the latest # new users to give interactive users
a chance to welcome the new user (default: 0)
-numberlog[:#] The number of users to welcome before refreshing the
welcome log (default: 4)
-filter Enable the username checks for bad names (default: False)
-ask Use this parameter if you want to confirm each possible
bad username (default: False)
-random Use a random signature, taking the signatures from a wiki
page (for istruction, see below).
-file[:#] Use a file instead of a wikipage to take the random sign.
N.B. If you use this parameter, you don't need to use -random.
-savedata This feature saves the random signature index to allow to
continue to welcome with the last signature used.
GUIDE ***********************************
Report, Bad and white list guide:
1) Set in the code which page it will use to load the badword, the
whitelist and the report
2) In these page you have to add a "tuple" with the names that you want to
add in the two list. For example: ('cat', 'mouse', 'dog')
You can write also other text in the page, it will work without problem.
3) What will do the two pages? Well, the Bot will check if a badword is in
the username and set the "warning" as True. Then the Bot check if a word
of the whitelist is in the username. If yes it remove the word and
recheck in the bad word list to see if there are other badword in the
username.
Example:
* dio is a badword
* Claudio is a normal name
* The username is "Claudio90 fuck!"
* The Bot find dio and set "warning"
* The Bot find Claudio and set "ok"
* The Bot find fuck at the end and set "warning"
* Result: The username is reported.
4) When a user is reported you have to check him and do:
Welcome! If you can't understand Chinese, please feel free to ask or request anything here. Thank you for visiting!
歡迎您的維基人是:~~~~
* If he's not, block him
* You can decide to put a "you are blocked, change another username"
template or not.
* Delete the username from the page.
IMPORTANT : The Bot check the user in this order:
* Search if he has a talkpage (if yes, skip)
* Search if he's blocked, if yes he will be skipped
* Search if he's in the report page, if yes he will be skipped
* If no, he will be reported.
Random signature guide:
Some welcomed users will answer to the one who has signed the welcome message.
When you welcome many new users, you might be overwhelmed with such answers.
Therefore you can define usernames of other users who are willing to receive
some of these messages from newbies.
1) Set the page that the bot will load
2) Add the signatures in this way:
<SPACE>SIGNATURE
<NEW LINE>
Example:
* [[User:Filnik|Filnik]]
* [[User:Rock|Rock]]
NOTE: The white space and
aren't required but I suggest you to
use them.
Known issues/FIXMEs ****************************
use default pages if a wiki is not configured, so no configuration of
the script would be required at all. Suggestion: use English language
defaults.
The regex to load the user might be slightly different from project to project.
(in this case, write to Filnik for help...)
Understand if it's the case to use a class to group toghether the functions used.
Badwords ***********************************
The list of Badwords of the code is opened. If you think that a word is international
and it must be blocked in all the projects feel free to add it. If also you think that
a word isn't so international, feel free to delete it.
However, there is a dinamic-wikipage to load that badwords of your project or you can
add them directly in the source code that you are using without adding or deleting.
Some words, like "Administrator" or "Dio" (God in italian) or "Jimbo" aren't badword at all
but can be used to some bad-nickname.
"""
The page where the bot will report users with a possibly bad username.
report_page = {
'commons': u'Project:Administrators\' noticeboard/User problems/Usernames to be checked',
'ar': 'Project:إخطار الإداريين/أسماء مستخدمين للفحص',
'de': u'Benutzer:Filnik/Report',
'en': u'Project:Administrator intervention against vandalism',
'fa': u'Project:تابلوی اعلانات مدیران/گزارش ربات',
'it': u'Utente:Filbot/Report',
'nl': u'Project:Verzoekpagina voor moderatoren/RegBlok/Te controleren gebruikersnamen',
'no': u'Bruker:JhsBot II/Rapport',
'sq': u'User:EagleBot/Report',
}
The edit summary for reporting a possibly bad username.
comment = {
'commons':u'Adding a username that needs to be checked',
'ar':u'إضافة اسم مستخدم يحتاج للفحص',
'de':u'Ergänze zu überprüfenden Benutzernamen',
'en':u'Adding a username that needs to be checked',
'fa':u'افزودن حساب کاربری نیازمند بررسی',
'it':u'Aggiunto utente da controllare',
'nl':u'Te controleren gebruikersnaam toegevoegd',
'no':u'Legger til et brukernavn som m? sjekkes',
'sq':u'Added username to be checked',
}
The page where the bot reads the real-time bad words page
'commons':u"\n*%s (討論·貢獻·日誌)" + timeselected,
'ar':u"\n*Template:User13" + timeselected,
'de':u'\n*Benutzer Diskussion:%s ' + timeselected,
'en':u'\n*%s(討論·貢獻·刪除貢獻·日誌·過濾器日誌·封禁·封禁日誌) ' + timeselected,
'fa':u'\n*Template:کاربر' + timeselected,
'it':u"\nTemplate:Reported'
break
else:
final_rep = rep_text
# Checking in the whitelist...
for xy in whitelist:
if xy.lower() in username.lower():
username.replace(xy, )
for word in elenco:
if word.lower() in username.lower():
baduser = True
else:
baduser = False
# He has a badusername, trying to report him...
if baduser == True:
while 1:
if ask == True:
wikipedia.output(u'%s may have an unwanted username, what shall i do?' % username )
answer = wikipedia.input(u'[B]lock or [W]elcome?')
for w in block:
if w in answer:
if not usertalkpage.exists():
# Check if the user has been already blocked (second check).
ki = blocked(wsite, username)
if ki == True:
wikipedia.output(u'%s has been blocked! Skipping him...' % username)
continue
report(wsite, rep_page, username, com, final_rep)
break
else:
wikipedia.output(u'The discussion page of the bad-user already exist...')
running = False
for w in say_hi:
if w in answer:
baduser = False
break
elif ask == False:
wikipedia.output(u'%s is possibly an unwanted username. He will be reported.' % username)
if not usertalkpage.exists():
report(wsite, rep_page, username, com, final_rep)
break
else:
wikipedia.output(u'The discussion page of the bad-user already exist...')
break
# He has a good username, welcome!
elif baduser == False:
if not usertalkpage.exists():
# Tring to put the welcome...
try:
# make non-minor edit to trigger new talk page message.
usertalkpage.put(welcom, summ, minorEdit = False)
welcomed_users.append(found_result)
if random == True:
number_user += 1
yield number_user
except wikipedia.EditConflict:
wikipedia.output(u'An edit conflict has occured, skipping this user.')
continue
else:
wikipedia.output(u'%s has been already welcomed when i was loading all the users... skipping' % username)
continue
# That's the log
if log_variable == True and logg:
if len(welcomed_users) == 1:
wikipedia.output(u'One user has been welcomed.')
elif len(welcomed_users) == 0:
wikipedia.output(u'No users have been welcomed.')
else:
wikipedia.output(u'%s users have been welcomed.' % str(len(welcomed_users)) )
if len(welcomed_users) < numberlog:
continue
# Update the welcome log each fifth welcome message.
elif len(welcomed_users) >= numberlog:
logresult = logmaker(wsite, welcomed_users, logg, summ2, usernam, contrib)
welcomed_users = list()
if logresult == False:
continue
# If we haven't to report, do nothing.
elif log_variable == False:
pass
if log_variable == True and logg and len(welcomed_users) != 0:
if len(welcomed_users) == 1:
wikipedia.output(u'Putting the log of the latest user...')
else:
wikipedia.output(u'Putting the log of the latest %d users...' % len(welcomed_users))
logresult2 = logmaker(wsite, welcomed_users, logg, summ2, usernam, contrib)
welcomed_users = list()
if logresult2 == False:
continue
# If recursive, don't exit, repeat after one hour.
if recursive == True:
waitstr = unicode(time_variable)
if locale.getlocale()[1]:
strfstr = unicode(time.strftime(u"%d %b %Y %H:%M:%S (UTC)", time.gmtime()), locale.getlocale()[1])
else:
strfstr = unicode(time.strftime(u"%d %b %Y %H:%M:%S (UTC)", time.gmtime()))
wikipedia.output(u'Sleeping %s seconds before rerun. %s' % (waitstr, strfstr))
time.sleep(time_variable)
# If not recursive, break.
elif recursive == False:
yield [number_user, 'STOP']
if __name__ == "__main__":
# Use try and finally, to put the wikipedia.stopme() always at the end of the code.
try:
number_user = None
settingsBot = mainSettings()
# Take two settings for the "finally" block.
filename = settingsBot[2]
random = settingsBot[11]
savedata = settingsBot[13]
# I need to know what is the number_user, in this way I get it.
for x in main(settingsBot):
try:
number_user = x[0]
except TypeError:
number_user = x
else:
break
except wikipedia.BadTitle:
wikipedia.output(u"Wikidown or server's problem. Quit.")
wikipedia.stopme()
# finally:
# If there is the savedata, the script must save the number_user.
if random == True and savedata == True and number_user != None:
f = file(filename, 'w')
cPickle.dump(number_user, f)
f.close()
wikipedia.stopme()