User:Tony Sidaway/spoilers.scm

From Wikipedia, the free encyclopedia

;
(require-extension srfi-1)
(require-extension srfi-13)
(require-extension irnc-base)
(require-extension posix)

(define (get-page-contents wiki page)
  (and-let* (
    [page-contents-response
      (irnc-api wiki
                `((action . "query")
                  (prop . "revisions")
                  (titles . ,page)
                  (rvprop . "content")))]
    [page-contents-xml
      (and (not (null? page-contents-response))
           (cdr page-contents-response))]
    [rev ((sxpath "api/query/pages/page/revisions/rev")
            page-contents-xml)]
    [page-contents
      (and (not (null? rev))
           (cadar rev))])
    page-contents))

(define (page-contains-pattern wiki page pattern)
  (and-let* (
    [page-contents (get-page-contents wiki page)])
    ;;(pretty-print content)
    (string-search pattern page-contents)))

(define (wiki-list lst)
  (let loop ([lst lst] [str ""])
    (if (null? lst) str
      (loop (cdr lst) (string-append str "* {{la|" (->string (car lst)) "}}\n")))))
            

(define (articles-containing-spoilers wiki spoiler-list)
  (let* (
    [possible-spoilers
      (filter
        (lambda (article) (not (member article spoiler-list)))
        (irnc-search wiki "spoiler" 50000))]
    [spoilers
      (filter
        (lambda (page)
          (page-contains-pattern wiki page "[Ss][Pp][Oo][Ii][Ll][Ee][Rr]"))
        possible-spoilers)])
    spoilers))

(define (wiki-heading level title)
  (let ([equals (make-string level #\=)])
    (string-append
      equals title equals "\n")))

(irnc-debug 0)
(let* (
      [config-file (string-append (getenv "HOME") "/.ironchicken")]
      [wiki (irnc-config config-file 'wiki)]
      [username (irnc-config config-file 'user)]
      [password (irnc-config config-file 'password)]
      [spoiler-file "./.spoilersrc"]
      [spoiler-list (with-input-from-file spoiler-file read)]
      [login-handle (irnc-login wiki username password)])
  (or login-handle
      (begin (display "Login failure")(newline)(exit)))
  (let ((edit-handle (irnc-edit login-handle "User:Tony Sidaway/spoilers")))
    (irnc-submit edit-handle
      (string-append
        (wiki-heading 2 "Pages unexpectedly containing the word \"spoiler\"")
        (wiki-list (articles-containing-spoilers wiki spoiler-list)))
      (string-append
        "List of pages unexpectedly containing the word \"spoiler\" "
        "compiled by " username " using " (irnc-user-agent)))))