-(defun riece-current-nickname ()
- "Return the current nickname."
- (riece-with-server-buffer
- (if riece-real-nickname
- (riece-make-identity riece-real-nickname))))
+(defmacro riece-with-identity-buffer (identity &rest body)
+ `(let ((process (riece-server-process (riece-identity-server ,identity))))
+ (if process
+ (with-current-buffer (process-buffer process)
+ ,@body)
+ (error "Server closed."))))
+
+(put 'riece-with-identity-buffer 'lisp-indent-function 1)
+
+(defun riece-decode-identity (identity &optional prefix-only)
+ (riece-with-identity-buffer identity
+ (let ((prefix (riece-decode-coding-string
+ (riece-identity-prefix identity)))
+ (server (riece-identity-server identity)))
+ (if (or prefix-only (equal server ""))
+ prefix
+ (concat prefix " " server)))))
+
+(defun riece-encode-identity (string)
+ (let ((prefix (if (string-match " " string)
+ (substring string 0 (match-beginning 0))
+ string))
+ (server (if (string-match " " string)
+ (substring string (match-end 0))
+ "")))
+ (riece-with-server-buffer server
+ (riece-make-identity (riece-encode-coding-string prefix) server))))
+
+(defun riece-completing-read-identity (prompt channels
+ &optional predicate must-match)
+ (let* ((decoded
+ (completing-read
+ prompt
+ (delq nil (mapcar (lambda (channel)
+ (list (riece-decode-identity channel)))
+ (or channels riece-current-channels)))
+ predicate must-match))
+ (encoded
+ (riece-encode-identity decoded)))
+ (if (and (not (string-match "[ ,]" decoded))
+ (string-match "[ ,]" (riece-identity-prefix encoded))
+ (not (y-or-n-p (format "The encoded channel name contains illegal character \"%s\". continue? "
+ (match-string 0 (riece-identity-prefix encoded))))))
+ (error "Invalid channel name!"))
+ encoded))