commit
1c19ab87c0
1 changed files with 215 additions and 0 deletions
@ -0,0 +1,215 @@ |
|||||
|
#! /usr/bin/racket |
||||
|
#lang racket |
||||
|
|
||||
|
(define (parse-flags bitf) |
||||
|
(filter identity |
||||
|
(map |
||||
|
(lambda (flag) |
||||
|
(cond |
||||
|
[(bitwise-bit-set? bitf (cadr flag)) |
||||
|
(cons |
||||
|
(car flag) |
||||
|
(caddr flag))] |
||||
|
[else #f])) |
||||
|
[list (list "try_all_servers" 0 "no weechat equivalent") |
||||
|
(list "use_default" 1 #t) |
||||
|
(list "ssl" 2 "on") |
||||
|
(list "autoconnect" 3 "on") |
||||
|
(list "proxy" 4 "\"\"") |
||||
|
(list "ssl_verify" 5 "off") |
||||
|
(list "favourited" 6 "no weechat equivalent")]))) |
||||
|
|
||||
|
(define (make-server params) |
||||
|
(let* ([lines (regexp-split |
||||
|
#px"\n" |
||||
|
params)] |
||||
|
[assocs (map parse-equation |
||||
|
(filter-not |
||||
|
(curry equal? "") |
||||
|
lines))]) |
||||
|
(make-hash (gather-dups |
||||
|
(map |
||||
|
(lambda (p) |
||||
|
(match (car p) |
||||
|
["F" |
||||
|
(cons |
||||
|
(translate-prop (car p)) |
||||
|
(parse-flags |
||||
|
(string->number (cdr p))))] |
||||
|
[_ (cons |
||||
|
(translate-prop (car p)) |
||||
|
(cdr p))])) |
||||
|
assocs))))) |
||||
|
|
||||
|
(define (parse-equation line) |
||||
|
(let* ([splitted (regexp-split |
||||
|
#px"=" |
||||
|
line)] |
||||
|
[name (car splitted)] |
||||
|
[val (cadr splitted)]) |
||||
|
(cons name val))) |
||||
|
|
||||
|
(define (parse-file str) |
||||
|
(let ([servers (regexp-split |
||||
|
#px"(?m:^[:blank:]*$)" |
||||
|
str)]) |
||||
|
(map make-server (drop servers 1)))) |
||||
|
|
||||
|
(define (get-xchat) |
||||
|
(parse-file |
||||
|
(file->string |
||||
|
(string->path |
||||
|
"/home/wes/.xchat2/servlist_.conf")))) |
||||
|
|
||||
|
(define translate-prop |
||||
|
(let ([hash (make-hash |
||||
|
'(["N" . "name"] |
||||
|
["I" . "nicks"] |
||||
|
["i" . "nicks"] |
||||
|
["U" . "username"] |
||||
|
["R" . "realname"] |
||||
|
["J" . "autojoin"] |
||||
|
["B" . "password"] |
||||
|
["S" . "addresses"] |
||||
|
["P" . "password"] |
||||
|
["E" . "encoding"] |
||||
|
["C" . "connect_cmd"] |
||||
|
["F" . "flags"] |
||||
|
["D" . "primary_server_number"]))]) |
||||
|
(lambda (key) |
||||
|
(hash-ref hash key "")))) |
||||
|
|
||||
|
(define translate-val |
||||
|
(let ([hash (make-hash |
||||
|
(list |
||||
|
[cons "addresses" (lambda (val) (format "\"~a\"" val))] |
||||
|
[cons "realname" (lambda (val) (regexp-replace #px"\\s" val ""))] |
||||
|
[cons "username" (lambda (val) (regexp-replace #px"\\s" val ""))]))]) |
||||
|
(lambda (prop val) |
||||
|
((hash-ref hash |
||||
|
prop |
||||
|
(const identity)) |
||||
|
val)))) |
||||
|
|
||||
|
(define (take-while pred xs) |
||||
|
(cond |
||||
|
[(empty? xs) '()] |
||||
|
[(not (pred (car xs))) '()] |
||||
|
[else (cons |
||||
|
(car xs) |
||||
|
(take-while pred (cdr xs)))])) |
||||
|
|
||||
|
(define (drop-while pred xs) |
||||
|
(cond |
||||
|
[(empty? xs) '()] |
||||
|
[(not (pred (car xs))) xs] |
||||
|
[else (drop-while pred (cdr xs))])) |
||||
|
|
||||
|
(define (take-dups xs) |
||||
|
(take-while |
||||
|
(lambda (x) (equal? |
||||
|
(caar xs) |
||||
|
(car x))) |
||||
|
xs)) |
||||
|
|
||||
|
(define (drop-dups xs) |
||||
|
(drop-while |
||||
|
(lambda (x) (equal? |
||||
|
(caar xs) |
||||
|
(car x))) |
||||
|
xs)) |
||||
|
|
||||
|
(define (group-sorted xs) |
||||
|
(cond |
||||
|
[(empty? xs) '()] |
||||
|
[else |
||||
|
(let ([chunk (take-dups xs)] |
||||
|
[rest (drop-dups xs)]) |
||||
|
(cons |
||||
|
chunk |
||||
|
(group-sorted rest)))])) |
||||
|
|
||||
|
(define (collapse-pairs pairs) |
||||
|
(cons |
||||
|
(caar pairs) |
||||
|
(list |
||||
|
(map cdr pairs)))) |
||||
|
|
||||
|
(define (gather-dups assocs) |
||||
|
(let* ([sorted |
||||
|
(sort assocs |
||||
|
string<? |
||||
|
#:key car)]) |
||||
|
(map collapse-pairs |
||||
|
(group-sorted sorted)))) |
||||
|
|
||||
|
(define (output-field server h field) |
||||
|
(let ([result (hash-ref h field #f)]) |
||||
|
(if result |
||||
|
(displayln (format |
||||
|
"~a.~a = ~a" |
||||
|
(caar server) |
||||
|
field |
||||
|
(translate-val field (caar result)))) |
||||
|
(displayln |
||||
|
(format |
||||
|
"~a.~a" |
||||
|
(caar server) |
||||
|
field))))) |
||||
|
|
||||
|
(define (handle-flags h) |
||||
|
(match (hash-ref h "flags" #f) |
||||
|
[#f h] |
||||
|
[flags |
||||
|
(match flags |
||||
|
['() h] |
||||
|
[flags |
||||
|
(for ([flag (caar flags)]) |
||||
|
(hash-set! h (car flag) `((,(cdr flag))) )) |
||||
|
(hash-remove! h "flags") |
||||
|
h])])) |
||||
|
|
||||
|
(define weechat-properties |
||||
|
'("addresses" |
||||
|
"proxy" |
||||
|
"ipv6" |
||||
|
"ssl" |
||||
|
"ssl_cert" |
||||
|
"ssl_priorities" |
||||
|
"ssl_dhkey_size" |
||||
|
"ssl_verify" |
||||
|
"password" |
||||
|
"capabilities" |
||||
|
"sasl_mechanism" |
||||
|
"sasl_username" |
||||
|
"sasl_password" |
||||
|
"sasl_timeout" |
||||
|
"autoconnect" |
||||
|
"autoreconnect" |
||||
|
"autoreconnect_delay" |
||||
|
"nicks" |
||||
|
"username" |
||||
|
"realname" |
||||
|
"local_hostname" |
||||
|
"command" |
||||
|
"command_delay" |
||||
|
"autojoin" |
||||
|
"autorejoin" |
||||
|
"autorejoin_delay" |
||||
|
"connection_timeout" |
||||
|
"anti_flood_prio_high" |
||||
|
"anti_flood_prio_low" |
||||
|
"away_check" |
||||
|
"away_check_max_nicks" |
||||
|
"default_msg_part" |
||||
|
"default_msg_quit" |
||||
|
"notify")) |
||||
|
|
||||
|
(for ([h (map handle-flags (get-xchat))] #:unless |
||||
|
(not (hash-ref h "name" #f))) |
||||
|
(let ([out |
||||
|
(curry output-field (hash-ref h "name") h)]) |
||||
|
(displayln "[Server]") |
||||
|
(for ([prop weechat-properties]) |
||||
|
(out prop)) |
||||
|
(displayln ""))) |
Reference in new issue