peoplewelcome-a-bit for Wikinews - People at Savannah: View a Job


receive news notifications by email for welcome-a-bit for Wikinews

Category: Tester
Submitter: svetlana
Date: Mon 18 Feb 2019 10:00:36 AM UTC
Status: Open

This group is not part of the GNU Project.

This project is designed to encourage involvement of people with newly submitted articles at Wikinews by sending them instant notifications of new submissions in their topics of interest.

To sign up, add your name to the page .

Currently we support delivery of notifications by e-mail. We may deliver the notifications to wiki pages, Android push notifications, or IRC in the future; if you are interested in any of these methods please send me a message.

This project is in the beta stage. You are encouraged to test it and share your feedback. To report any bugs or suggestions, please leave a message using any of the below venues:

- e-mail -email is unavailable-
- open an issue using the 'issues' link at the top
- query live chat at #wikinews at freenode
- leave a message on-wiki at

Draft version

# Copyright (C) 2018 Svetlana Tkachenko
#    This file is part of WeABit, Welcome-a-bit for Wikinews.
#    WeABit is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#    WeABit is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    GNU General Public License for more details.
#    You should have received a copy of the GNU General Public License
#    along with WeABit.  If not, see <>.

# 1. read in a list of rss feeds and usernames
# 2.

use strict;
use warnings;

use open ':std', ':encoding(UTF-8)';

use MediaWiki::API;
use LWP::Simple;

use Data::Dumper;
use String::Util qw(trim);
use POSIX qw(strftime);

# use wabget;

my $mw = MediaWiki::API->new();
my $wikiURL = ''; # /w/api.php';
$mw->{config}->{api_url} = "$wikiURL/w/api.php";

  my $datestring = strftime "%a %b %e %H:%M:%S %Y", localtime;
  printf("date and time - $datestring\n");
  # get category members of 'Gryllida/WAB'
  my $members_ref = $mw->api ( {
    action      => 'query',
    list => 'categorymembers',
    cmtitle => 'Category:Gryllida/WAB4',
    cmlimit => 500
  my $members = $members_ref->{query}->{categorymembers};
  my $n = scalar(@{$members});

  # For each WAB tracking page, extract the username and categories therein.
  my $tracker={};
  my $oldStamp = 0;
  for (my $i=0; $i < $n; $i++) {
    my $output = {};
    my $title = $members->[$i]->{title};
    my @partsOfTitle = split /\//, $title;
    $partsOfTitle[0] =~ s/User\://;
    my $username =$partsOfTitle[0];
    my $typeOfArticles =$partsOfTitle[2]; # dev or pub
    my $deliveryType =$partsOfTitle[3]; # email or wiki
    # Get the user's time stamp
    my $talkPageTitle = "User talk:$username/wab/$typeOfArticles/$deliveryType";
    my $url2 = "$wikiURL/wiki/$talkPageTitle?action=raw";
    my $content2 = get($url2);
    my @lines2 =  split /^/, $content2;
    my $userTs = $lines2[0];
    print "User time stamp: $userTs (for $username) \r\n";
    # Get list of categories of the user
    my $url = "$wikiURL/wiki/$title?action=raw";
    my $content = get($url);
    my @lines =  split /^/, $content;

    for my $line (@lines){
      if ($line =~ s/\*(.*)/$1/){
        my $cat = trim($line);

        my $uinfo = {
          'deliveryType' => $deliveryType,
          'talkPageTitle' => $talkPageTitle,
          'userTs' => $userTs,
          'username' => $username
        push @{$tracker->{$cat}->{$typeOfArticles}}, $uinfo;
        if($userTs > $oldStamp){
          $oldStamp = $userTs;
  # rcstart = $oldStamp
  my $raw_newpages_ref = $mw->api ( {
    action      => 'query',
    list => 'recentchanges',
#   rcstart => $oldStamp, # XXX add this
    rctype => 'categorize',
    rcprop => 'user|title|ids'
#   rcnamespace => 0,
#   prop => 'title'

  my $newpages_ref = $raw_newpages_ref->{query}->{recentchanges};

  my $deliveryBuffer = {};
  for my $newpageinfo (@{$newpages_ref}){
    print Dumper $newpageinfo;
    my $categorizer = $newpageinfo->{user};
    my $pageId = $newpageinfo->{pageid};
    $newpageinfo->{title} =~ s/.*?:(.*)/$1/;
    my $catName = $newpageinfo->{title};
    print "Category: $catName\r\n";

    if(!exists $tracker->{$catName}){next;}
    print "Processing category '$catName'\r\n";

    my $raw_pagecats = $mw->api ( {
      action      => 'query',
      prop => 'categories',
      pageids => $pageId,
    print "Raw $pageId page category data: ";
    my $ns = $raw_pagecats->{query}->{pages}->{$pageId}->{ns};
    my $cats = $raw_pagecats->{query}->{pages}->{$pageId}->{categories};
    my $catsTitles = [map { $_->{title} } @$cats];
    map {s/Category\://g; } @{$catsTitles};
    print Dumper $catsTitles;
    print "...done.\r\n";
    my $articleType = '';
    if('Published' ~~ $catsTitles){
      $articleType = 'pub';
      $articleType = 'dev';

    #2. Add to delivery
    if(!exists $tracker->{$catName}->{$articleType}){next;}
    print "Processing category '$catName'\r\n";
    print Dumper  $tracker->{$catName}->{$articleType};
    my $deliveryTargets = $tracker->{$catName}->{$articleType};
    for my $deliveryTarget (@{$deliveryTargets}){
      print "Page ID: $pageId\r\n";
      $deliveryBuffer->{$deliveryTarget->{username}}->{$pageId} = $deliveryTarget;
      print Dumper $deliveryBuffer;
  # print Dumper $deliveryBuffer;
  sleep(600); # check every 10 minutes

License GNU General Public License v3 or later

Development Status
: 4 - Beta

Details (job description, contact ...):

Please sign up at to receive news drafts and publications notifications by email. You will need to create an account and confirm your e-mail at the wiki.

We need your help to ensure the software that delivers the notifications ( is working correctly.

Please visit the home page linked in the second paragraph to learn how to contact me and leave your feedback.

Required Skills:

Skill Level Experience

(No skill inventory set up)

Back to the top

Powered by Savane 3.13-3cd0.
Corresponding source code