logo

oasis-root

Compiled tree of Oasis Linux based on own branch at <https://hacktivis.me/git/oasis/> git clone https://anongit.hacktivis.me/git/oasis-root.git

pounce.1 (17269B)


  1. .Dd October 5, 2021
  2. .Dt POUNCE 1
  3. .Os
  4. .
  5. .Sh NAME
  6. .Nm pounce
  7. .Nd IRC bouncer
  8. .
  9. .Sh SYNOPSIS
  10. .Nm
  11. .Op Fl LNTev
  12. .Op Fl A Ar local-ca
  13. .Op Fl C Ar local-cert
  14. .Op Fl H Ar local-host
  15. .Op Fl K Ar local-priv
  16. .Op Fl P Ar local-port
  17. .Op Fl Q Ar queue-interval
  18. .Op Fl R Ar blind-req
  19. .Op Fl S Ar bind
  20. .Op Fl U Ar local-path
  21. .Op Fl W Ar local-pass
  22. .Op Fl a Ar sasl-plain
  23. .Op Fl c Ar client-cert
  24. .Op Fl f Ar save
  25. .Op Fl h Ar host
  26. .Op Fl j Ar join
  27. .Op Fl k Ar client-priv
  28. .Op Fl m Ar mode
  29. .Op Fl n Ar nick
  30. .Op Fl p Ar port
  31. .Op Fl q Ar quit
  32. .Op Fl r Ar real
  33. .Op Fl t Ar trust
  34. .Op Fl s Ar size
  35. .Op Fl u Ar user
  36. .Op Fl w Ar pass
  37. .Op Fl y Ar away
  38. .Op Ar config ...
  39. .
  40. .Nm
  41. .Fl o
  42. .Op Fl S Ar bind
  43. .Op Fl h Ar host
  44. .Op Fl p Ar port
  45. .Op Ar config ...
  46. .
  47. .Nm
  48. .Op Fl A Ar ca
  49. .Fl g Ar cert
  50. .
  51. .Nm
  52. .Fl x
  53. .
  54. .Sh DESCRIPTION
  55. The
  56. .Nm
  57. program
  58. is a multi-client, TLS-only IRC bouncer.
  59. It maintains a persistent connection to an IRC server
  60. while allowing clients to connect and disconnect,
  61. receiving messages that were missed upon reconnection.
  62. Clients must uniquely identify themselves to
  63. .Nm
  64. by their IRC username
  65. (not nickname).
  66. The IRCv3
  67. .Sy server-time
  68. extension is used to indicate
  69. when messages were originally received.
  70. See
  71. .Sx Client Configuration
  72. for details.
  73. .
  74. .Pp
  75. The local server portion of
  76. .Nm
  77. requires a TLS certificate,
  78. which can be obtained for example
  79. by an ACME client such as
  80. .Xr acme-client 8 .
  81. The private key
  82. must be made readable by
  83. the user running
  84. .Nm .
  85. .
  86. .Pp
  87. One instance of
  88. .Nm
  89. must be configured for each IRC network.
  90. Instances of
  91. .Nm
  92. must either use different local ports with
  93. .Cm local-port
  94. or different local host names with
  95. .Cm local-host
  96. and
  97. .Cm local-path
  98. to be dispatched from the same port by
  99. .Xr calico 1 .
  100. .
  101. .Pp
  102. Client connections are not accepted
  103. until successful login to the server.
  104. If the server connection is lost,
  105. the
  106. .Nm
  107. process exits.
  108. .
  109. .Pp
  110. Options can be loaded from
  111. files listed on the command line.
  112. Files are searched for in
  113. .Pa $XDG_CONFIG_DIRS/pounce
  114. .Po
  115. usually
  116. .Pa ~/.config/pounce
  117. .Pc
  118. unless the path starts with
  119. .Ql / ,
  120. .Ql \&./
  121. or
  122. .Ql \&../ .
  123. Certificate and private key paths
  124. are searched for in the same manner.
  125. Files and flags
  126. listed later on the command line
  127. take precedence over those listed earlier.
  128. .
  129. .Pp
  130. Each option is placed on a line,
  131. and lines beginning with
  132. .Ql #
  133. are ignored.
  134. The options are listed below
  135. following their corresponding flags.
  136. .
  137. .Ss Local Server Options
  138. .Bl -tag -width Ds
  139. .It Fl A Ar path | Cm local-ca No = Ar path
  140. Require clients to authenticate
  141. using a TLS client certificate
  142. either contained in
  143. or signed by a certificate in
  144. the file loaded from
  145. .Ar path .
  146. The file is reloaded when the
  147. .Dv SIGUSR1
  148. signal is received.
  149. See
  150. .Sx Generating Client Certificates .
  151. If
  152. .Cm local-pass
  153. is also set,
  154. clients may instead authenticate
  155. with a server password.
  156. .
  157. .It Fl C Ar path | Cm local-cert No = Ar path
  158. Load TLS certificate from
  159. .Ar path .
  160. The file is reloaded when the
  161. .Dv SIGUSR1
  162. signal is received.
  163. The default path is
  164. .Ar host Ns .pem ,
  165. where
  166. .Ar host
  167. is set by
  168. .Cm local-host .
  169. .
  170. .It Fl H Ar host | Cm local-host No = Ar host
  171. Bind to
  172. .Ar host .
  173. The default host is localhost.
  174. .
  175. .It Fl K Ar path | Cm local-priv No = Ar path
  176. Load TLS private key from
  177. .Ar path .
  178. The file is reloaded when the
  179. .Dv SIGUSR1
  180. signal is received.
  181. The default path is
  182. .Ar host Ns .key ,
  183. where
  184. .Ar host
  185. is set by
  186. .Cm local-host .
  187. .
  188. .It Fl L | Cm palaver
  189. Advertise the
  190. .Sy palaverapp.com
  191. IRCv3 vendor-specific capability to clients.
  192. This option only enables the capability;
  193. push notifications must be provided by the
  194. .Xr pounce-palaver 1
  195. special-purpose client.
  196. .
  197. .It Fl P Ar port | Cm local-port No = Ar port
  198. Bind to
  199. .Ar port .
  200. The default port is 6697.
  201. .
  202. .It Fl T | Cm no-sts
  203. Do not advertise a
  204. strict transport security (STS) policy
  205. to clients.
  206. .
  207. .It Fl U Ar path | Cm local-path No = Ar path
  208. Bind to a UNIX-domain socket at
  209. .Ar path .
  210. Clients are only accepted as dispatched by
  211. .Xr calico 1 .
  212. If
  213. .Ar path
  214. is a directory,
  215. the
  216. .Ar host
  217. set by
  218. .Cm local-host
  219. is appended to it.
  220. This option takes precedence over
  221. .Cm local-host
  222. and
  223. .Cm local-port .
  224. .
  225. .It Fl W Ar pass | Cm local-pass No = Ar pass
  226. Require the server password
  227. .Ar pass
  228. for clients to connect.
  229. The
  230. .Ar pass
  231. string must be hashed using
  232. .Fl x .
  233. If
  234. .Cm local-ca
  235. is also set,
  236. clients may instead authenticate
  237. using a TLS client certificate.
  238. .
  239. .It Fl f Ar path | Cm save No = Ar path
  240. Save and load the contents of the buffer from
  241. .Ar path
  242. in
  243. .Pa $XDG_DATA_DIRS/pounce ,
  244. usually
  245. .Pa ~/.local/share/pounce ,
  246. or an absolute or relative path if
  247. .Ar path
  248. starts with
  249. .Ql / ,
  250. .Ql \&./
  251. or
  252. .Ql \&../ .
  253. The file is truncated after loading.
  254. .
  255. .It Fl s Ar size | Cm size No = Ar size
  256. Set the number of messages contained in the buffer to
  257. .Ar size .
  258. This sets the maximum number
  259. of recent messages
  260. which can be relayed
  261. to a reconnecting client.
  262. The size must be a power of two.
  263. The default size is 4096.
  264. .El
  265. .
  266. .Ss Remote Server Options
  267. .Bl -tag -width Ds
  268. .It Fl N | Cm no-names
  269. Do not request
  270. .Ql NAMES
  271. for each channel when a client connects.
  272. This avoids already connected clients
  273. receiving unsolicited responses
  274. but prevents new clients from populating user lists.
  275. .
  276. .It Fl Q Ar ms | Cm queue-interval No = Ar ms
  277. Set the server send queue interval in milliseconds.
  278. The queue is used
  279. to send automated messages from
  280. .Nm
  281. to the server.
  282. Messages from clients
  283. are sent to the server directly.
  284. The default interval is 200 milliseconds.
  285. .
  286. .It Fl R Ar caps | Cm blind-req No = Ar caps
  287. Blindly request the IRCv3 capabilities
  288. .Ar caps ,
  289. which must be supported by
  290. .Nm .
  291. This can be used to enable hidden capabilities,
  292. such as
  293. .Sy userhost-in-names
  294. on some networks.
  295. .
  296. .It Fl S Ar host | Cm bind No = Ar host
  297. Bind to source address
  298. .Ar host
  299. when connecting to the server.
  300. .
  301. .It Fl a Ar user : Ns Ar pass | Cm sasl-plain No = Ar user : Ns Ar pass
  302. Authenticate as
  303. .Ar user
  304. with
  305. .Ar pass
  306. using SASL PLAIN.
  307. Since this method requires
  308. the account password in plaintext,
  309. it is recommended to use CertFP instead with
  310. .Cm sasl-external .
  311. .
  312. .It Fl c Ar path | Cm client-cert No = Ar path
  313. Load the TLS client certificate from
  314. .Ar path .
  315. If the private key is in a separate file,
  316. it is loaded with
  317. .Cm client-priv .
  318. With
  319. .Cm sasl-external ,
  320. authenticate using SASL EXTERNAL.
  321. Certificates can be generated with
  322. .Fl g .
  323. .
  324. .It Fl e | Cm sasl-external
  325. Authenticate using SASL EXTERNAL,
  326. also known as CertFP.
  327. The TLS client certificate is loaded with
  328. .Cm client-cert .
  329. See
  330. .Sx Configuring CertFP .
  331. .
  332. .It Fl h Ar host | Cm host No = Ar host
  333. Connect to
  334. .Ar host .
  335. .
  336. .It Fl j Ar channels Oo Ar keys Oc | Cm join No = Ar channels Op Ar keys
  337. Join the comma-separated list of
  338. .Ar channels
  339. with the optional comma-separated list of channel
  340. .Ar keys .
  341. .
  342. .It Fl k Ar path | Cm client-priv No = Ar path
  343. Load the TLS client private key from
  344. .Ar path .
  345. .
  346. .It Fl m Ar mode | Cm mode No = Ar mode
  347. Set the user
  348. .Ar mode .
  349. .
  350. .It Fl n Ar nick | Cm nick No = Ar nick
  351. Set nickname to
  352. .Ar nick .
  353. The default nickname is the user's name.
  354. .
  355. .It Fl p Ar port | Cm port No = Ar port
  356. Connect to
  357. .Ar port .
  358. The default port is 6697.
  359. .
  360. .It Fl q Ar mesg | Cm quit No = Ar mesg
  361. Quit with message
  362. .Ar mesg
  363. when shutting down.
  364. .
  365. .It Fl r Ar real | Cm real No = Ar real
  366. Set realname to
  367. .Ar real .
  368. The default realname is the same as the nickname.
  369. .
  370. .It Fl t Ar path | Cm trust No = Ar path
  371. Trust the certificate loaded from
  372. .Ar path .
  373. Server name verification is disabled.
  374. See
  375. .Sx Connecting to Servers with Self-signed Certificates .
  376. .
  377. .It Fl u Ar user | Cm user No = Ar user
  378. Set username to
  379. .Ar user .
  380. The default username is the same as the nickname.
  381. .
  382. .It Fl w Ar pass | Cm pass No = Ar pass
  383. Log in with the server password
  384. .Ar pass .
  385. .
  386. .It Fl y Ar mesg | Cm away No = Ar mesg
  387. Set away status to
  388. .Ar mesg
  389. when no clients are connected
  390. and no other away status has been set.
  391. .El
  392. .
  393. .Ss Other Options
  394. .Bl -tag -width Ds
  395. .It Fl g Ar path
  396. Generate a TLS client certificate using
  397. .Xr openssl 1
  398. and write it to
  399. .Ar path .
  400. The certificate is signed
  401. by the certificate authority if
  402. .Fl A
  403. is set,
  404. otherwise it is self-signed.
  405. .
  406. .It Fl o
  407. Print the server certificate chain
  408. to standard output in PEM format
  409. and exit.
  410. .
  411. .It Fl v | Cm verbose
  412. Log IRC messages to standard output:
  413. .Pp
  414. .Bl -tag -width "<<" -compact
  415. .It <<
  416. from
  417. .Nm
  418. to the server
  419. .It >>
  420. from the server to
  421. .Nm
  422. .It ->
  423. from clients to
  424. .Nm
  425. .It <-
  426. from
  427. .Nm
  428. to clients
  429. .El
  430. .
  431. .It Fl x
  432. Prompt for a password
  433. and output a hash
  434. for use with
  435. .Cm local-pass .
  436. .El
  437. .
  438. .Ss Client Configuration
  439. Clients should be configured to
  440. connect to the host and port set by
  441. .Cm local-host
  442. and
  443. .Cm local-port ,
  444. with TLS or SSL enabled.
  445. If
  446. .Cm local-pass
  447. is used,
  448. clients must send a server password.
  449. If
  450. .Cm local-ca
  451. is used,
  452. clients must connect with a client certificate
  453. and may request SASL EXTERNAL.
  454. If both are used,
  455. clients may authenticate with either method.
  456. .
  457. .Pp
  458. Clients must register with unique usernames (not nicknames),
  459. for example the name of the client software
  460. or location from which it is connecting.
  461. New clients with the same username
  462. are assumed to be reconnections
  463. and will cause previous connections
  464. to stop receiving messages.
  465. The nickname and real name
  466. sent by clients are ignored.
  467. .
  468. .Pp
  469. Clients which request the
  470. .Sy causal.agency/passive
  471. capability
  472. or with usernames beginning with hyphen
  473. .Ql -
  474. are considered passive
  475. and do not affect automatic away status.
  476. .
  477. .Pp
  478. Pass-through of the following IRCv3 capabilities
  479. is supported:
  480. .Sy account-notify ,
  481. .Sy account-tag ,
  482. .Sy away-notify ,
  483. .Sy batch ,
  484. .Sy cap-notify ,
  485. .Sy chghost ,
  486. .Sy echo-message ,
  487. .Sy extended-join ,
  488. .Sy invite-notify ,
  489. .Sy labeled-response ,
  490. .Sy message-tags ,
  491. .Sy multi-prefix ,
  492. .Sy server-time ,
  493. .Sy setname ,
  494. .Sy userhost-in-names .
  495. .
  496. .Pp
  497. Private messages and notices
  498. sent to the user's own nickname
  499. are relayed only to other clients,
  500. not to the server.
  501. .
  502. .Ss Generating Client Certificates
  503. .Bl -enum
  504. .It
  505. Generate self-signed client certificates and private keys:
  506. .Bd -literal -offset indent
  507. $ pounce -g client1.pem
  508. $ pounce -g client2.pem
  509. .Ed
  510. .It
  511. Concatenate the certificate public keys into a CA file:
  512. .Bd -literal -offset indent
  513. $ openssl x509 -subject -in client1.pem \e
  514. >> ~/.config/pounce/auth.pem
  515. $ openssl x509 -subject -in client2.pem \e
  516. >> ~/.config/pounce/auth.pem
  517. .Ed
  518. .It
  519. Configure
  520. .Nm
  521. to verify client certificates
  522. against the CA file:
  523. .Bd -literal -offset indent
  524. local-ca = auth.pem
  525. # or: $ pounce -A auth.pem
  526. .Ed
  527. .El
  528. .
  529. .Pp
  530. Alternatively,
  531. client certificates can be signed
  532. by a generated certificate authority:
  533. .
  534. .Bl -enum
  535. .It
  536. Generate a self-signed certificate authority:
  537. .Bd -literal -offset indent
  538. $ pounce -g auth.pem
  539. .Ed
  540. .It
  541. Generate and sign client certificates
  542. using the CA:
  543. .Bd -literal -offset indent
  544. $ pounce -A auth.pem -g client1.pem
  545. $ pounce -A auth.pem -g client2.pem
  546. .Ed
  547. .It
  548. Since only the public key is needed
  549. for certificate verification,
  550. extract it from the CA:
  551. .Bd -literal -offset indent
  552. $ openssl x509 -in auth.pem -out ~/.config/pounce/auth.crt
  553. .Ed
  554. .It
  555. Configure
  556. .Nm
  557. to verify client certificates
  558. against the CA:
  559. .Bd -literal -offset indent
  560. local-ca = auth.crt
  561. # or: $ pounce -A auth.crt
  562. .Ed
  563. .El
  564. .
  565. .Ss Configuring CertFP
  566. .Bl -enum
  567. .It
  568. Generate a new TLS client certificate:
  569. .Bd -literal -offset indent
  570. $ pounce -g ~/.config/pounce/example.pem
  571. .Ed
  572. .It
  573. Connect to the server using the certificate:
  574. .Bd -literal -offset indent
  575. client-cert = example.pem
  576. # or: $ pounce -c example.pem
  577. .Ed
  578. .It
  579. Identify with services or use
  580. .Cm sasl-plain ,
  581. then add the certificate fingerprint to your account:
  582. .Bd -literal -offset indent
  583. /msg NickServ CERT ADD
  584. .Ed
  585. .It
  586. Enable SASL EXTERNAL
  587. to require successful authentication when connecting:
  588. .Bd -literal -offset indent
  589. client-cert = example.pem
  590. sasl-external
  591. # or: $ pounce -e -c example.pem
  592. .Ed
  593. .El
  594. .
  595. .Ss Connecting to Servers with Self-signed Certificates
  596. .Bl -enum
  597. .It
  598. Connect to the server
  599. and write its certificate to a file:
  600. .Bd -literal -offset indent
  601. $ pounce -o -h irc.example.org > ~/.config/pounce/example.pem
  602. .Ed
  603. .It
  604. Configure
  605. .Nm
  606. to trust the certificate:
  607. .Bd -literal -offset indent
  608. trust = example.pem
  609. # or: $ pounce -t example.pem
  610. .Ed
  611. .El
  612. .
  613. .Sh ENVIRONMENT
  614. .Bl -tag -width Ds
  615. .It Ev USER
  616. The default nickname.
  617. .El
  618. .
  619. .Sh FILES
  620. .Bl -tag -width Ds
  621. .It Pa $XDG_CONFIG_DIRS/pounce
  622. Configuration files, certificates and private keys
  623. are searched for first in
  624. .Ev $XDG_CONFIG_HOME ,
  625. usually
  626. .Pa ~/.config ,
  627. followed by the colon-separated list of paths
  628. .Ev $XDG_CONFIG_DIRS ,
  629. usually
  630. .Pa /etc/xdg .
  631. .It Pa ~/.config/pounce
  632. The most likely location of configuration files.
  633. .
  634. .It Pa $XDG_DATA_DIRS/pounce
  635. Save files are searched for first in
  636. .Ev $XDG_DATA_HOME ,
  637. usually
  638. .Pa ~/.local/share ,
  639. followed by the colon-separated list of paths
  640. .Ev $XDG_DATA_DIRS ,
  641. usually
  642. .Pa /usr/local/share:/usr/share .
  643. New save files are created in
  644. .Ev $XDG_DATA_HOME .
  645. .It Pa ~/.local/share/pounce
  646. The most likely location of save files.
  647. .El
  648. .
  649. .Sh EXAMPLES
  650. Start
  651. .Nm :
  652. .Bd -literal -offset indent
  653. $ pounce -H irc.example.org -h irc.tilde.chat -j '#ascii.town'
  654. .Ed
  655. .Pp
  656. Write an equivalent configuration file to
  657. .Pa ~/.config/pounce/tilde.conf :
  658. .Bd -literal -offset indent
  659. local-host = irc.example.org
  660. host = irc.tilde.chat
  661. join = #ascii.town
  662. .Ed
  663. .Pp
  664. Load the configuration file:
  665. .Bd -literal -offset indent
  666. $ pounce tilde.conf
  667. .Ed
  668. .
  669. .Pp
  670. Add a certificate to
  671. .Xr acme-client.conf 5 :
  672. .Bd -literal -offset indent
  673. domain irc.example.org {
  674. domain key "/home/user/.config/pounce/irc.example.org.key"
  675. domain full chain certificate \e
  676. "/home/user/.config/pounce/irc.example.org.pem"
  677. sign with letsencrypt
  678. }
  679. .Ed
  680. .Pp
  681. Obtain the certificate
  682. and make the private key readable by
  683. .Nm :
  684. .Bd -literal -offset indent
  685. # acme-client irc.example.org
  686. # chown user /home/user/.config/pounce/irc.example.org.key
  687. .Ed
  688. .Pp
  689. Renew and reload the certificate with a
  690. .Xr cron 8
  691. job:
  692. .Bd -literal -offset indent
  693. ~ * * * * acme-client irc.example.org && pkill -USR1 pounce
  694. .Ed
  695. .
  696. .Sh DIAGNOSTICS
  697. Upon receiving the
  698. .Dv SIGINFO
  699. signal,
  700. .Nm
  701. prints the current producer position
  702. and the positions of each consumer
  703. identified by username.
  704. Following each consumer position
  705. is the number by which it trails the producer.
  706. On systems lacking
  707. .Dv SIGINFO ,
  708. .Dv SIGUSR2
  709. is used.
  710. .
  711. .Pp
  712. If a client reconnects
  713. after having missed more messages
  714. than the size of the buffer,
  715. .Nm
  716. will print a warning:
  717. .Bd -ragged -offset indent
  718. consumer
  719. .Em name
  720. dropped
  721. .Em n
  722. messages
  723. .Ed
  724. .Pp
  725. The size of the buffer
  726. can be adjusted with
  727. .Fl s .
  728. .
  729. .Sh SEE ALSO
  730. .Xr calico 1
  731. .
  732. .Sh STANDARDS
  733. .Bl -item
  734. .It
  735. .Rs
  736. .%A Waldo Bastian
  737. .%A Ryan Lortie
  738. .%A Lennart Poettering
  739. .%T XDG Base Directory Specification
  740. .%U https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
  741. .%D November 24, 2010
  742. .Re
  743. .It
  744. .Rs
  745. .%A Kyle Fuller
  746. .%A St\('ephan Kochen
  747. .%A Alexey Sokolov
  748. .%A James Wheare
  749. .%T server-time Extension
  750. .%I IRCv3 Working Group
  751. .%U https://ircv3.net/specs/extensions/server-time
  752. .Re
  753. .It
  754. .Rs
  755. .%A Lee Hardy
  756. .%A Perry Lorier
  757. .%A Kevin L. Mitchell
  758. .%A Attila Molnar
  759. .%A Daniel Oakley
  760. .%A William Pitcock
  761. .%A James Wheare
  762. .%T IRCv3 Client Capability Negotiation
  763. .%I IRCv3 Working Group
  764. .%U https://ircv3.net/specs/core/capability-negotiation
  765. .Re
  766. .It
  767. .Rs
  768. .%A S. Josefsson
  769. .%T The Base16, Base32, and Base64 Data Encodings
  770. .%I IETF
  771. .%R RFC 4648
  772. .%U https://tools.ietf.org/html/rfc4648
  773. .%D October 2006
  774. .Re
  775. .It
  776. .Rs
  777. .%A C. Kalt
  778. .%T Internet Relay Chat: Client Protocol
  779. .%I IETF
  780. .%R RFC 2812
  781. .%U https://tools.ietf.org/html/rfc2812
  782. .%D April 2000
  783. .Re
  784. .It
  785. .Rs
  786. .%A Attila Molnar
  787. .%A James Wheare
  788. .%T IRCv3 Strict Transport Security
  789. .%I IRCv3 Working Group
  790. .%U https://ircv3.net/specs/extensions/sts
  791. .Re
  792. .It
  793. .Rs
  794. .%A Attila Molnar
  795. .%A William Pitcock
  796. .%T IRCv3.2 SASL Authentication
  797. .%I IRCv3 Working Group
  798. .%U https://ircv3.net/specs/extensions/sasl-3.2
  799. .Re
  800. .It
  801. .Rs
  802. .%A K. Zeilenga, Ed.
  803. .%T The PLAIN Simple Authentication and Security Layer (SASL) Mechanism
  804. .%I IETF
  805. .%R RFC 4616
  806. .%U https://tools.ietf.org/html/rfc4616
  807. .%D August 2006
  808. .Re
  809. .El
  810. .
  811. .Ss Extensions
  812. The
  813. .Sy causal.agency/consumer
  814. vendor-specific IRCv3 capability
  815. enables the
  816. .Sy causal.agency/pos
  817. message tag.
  818. The value of this tag
  819. is a 64-bit unsigned integer
  820. indicating the consumer position of the client
  821. after receiving each message,
  822. e.g.\&
  823. .Ql @causal.agency/pos=42069 .
  824. This capability may be requested
  825. with the value of the last
  826. .Sy causal.agency/pos
  827. tag received by the client,
  828. e.g.\&
  829. .Ql CAP REQ causal.agency/consumer=42069 ,
  830. setting its consumer position.
  831. By persisting this value across connections,
  832. a client can ensure no messages are missed,
  833. even in case of network issues or application crashes.
  834. .
  835. .Pp
  836. .%T IRCv3 Client Capability Negotiation
  837. specifies that capabilities MAY have values in
  838. .Ql CAP LS
  839. or
  840. .Ql CAP NEW
  841. responses.
  842. It does not, however,
  843. indicate if
  844. .Ql CAP REQ
  845. capabilities MUST NOT have values.
  846. The
  847. .Nm
  848. implementation parses
  849. .Ql CAP REQ
  850. values in the same way as
  851. .Ql CAP LS
  852. values.
  853. .
  854. .Pp
  855. The
  856. .Sy causal.agency/passive
  857. vendor-specific IRCv3 capability
  858. indicates that a client
  859. should not affect the automatic away status.
  860. .
  861. .Sh AUTHORS
  862. .An June Bug Aq Mt june@causal.agency
  863. .
  864. .Sh BUGS
  865. Send mail to
  866. .Aq Mt list+pounce@causal.agency
  867. or join
  868. .Li #ascii.town
  869. on
  870. .Li irc.tilde.chat .
  871. .
  872. .Pp
  873. A client will sometimes receive its own message,
  874. causing it to be displayed twice.
  875. This happens when a message is sent
  876. while responses are not yet consumed.