diff --git a/components/app.js b/components/app.js
index 9379d46..cca9841 100644
--- a/components/app.js
+++ b/components/app.js
@@ -1361,6 +1361,7 @@ export default class App extends Component {
<${Buffer}
buffer=${activeBuffer}
+ server=${activeServer}
onChannelClick=${this.handleChannelClick}
onNickClick=${this.handleNickClick}/>
diff --git a/components/buffer.js b/components/buffer.js
index ddf8e54..9d0c48a 100644
--- a/components/buffer.js
+++ b/components/buffer.js
@@ -3,6 +3,7 @@ import linkify from "../lib/linkify.js";
import * as irc from "../lib/irc.js";
import { strip as stripANSI } from "../lib/ansi.js";
import { BufferType, getNickURL, getChannelURL, getMessageURL } from "../state.js";
+import Membership from "./membership.js";
function djb2(s) {
let hash = 5381;
@@ -63,6 +64,8 @@ class LogLine extends Component {
render() {
let msg = this.props.message;
+ let buf = this.props.buffer;
+ let server = this.props.server;
let onNickClick = this.props.onNickClick;
let onChannelClick = this.props.onChannelClick;
@@ -88,6 +91,7 @@ class LogLine extends Component {
switch (msg.command) {
case "NOTICE":
case "PRIVMSG":
+ let target = msg.params[0];
let text = msg.params[1];
let ctcp = irc.parseCTCP(msg);
@@ -109,6 +113,15 @@ class LogLine extends Component {
content = html`${prefix}${createNick(msg.prefix.name)}${suffix} ${linkify(stripANSI(text), onChannelClick)}`;
}
+ let status = null;
+ let allowedPrefixes = server.isupport.get("STATUSMSG");
+ if (target !== buf.name && allowedPrefixes) {
+ let parts = irc.parseTargetPrefix(target, allowedPrefixes);
+ if (parts.name === buf.name) {
+ content = [html`(<${Membership} value=${parts.prefix}/>)`, " ", content];
+ }
+ }
+
if (msg.isHighlight) {
lineClass += " highlight";
}
@@ -154,7 +167,7 @@ class LogLine extends Component {
let invitee = msg.params[0];
let channel = msg.params[1];
// TODO: instead of checking buffer type, check if invitee is our nick
- if (this.props.buffer.type === BufferType.SERVER) {
+ if (buf.type === BufferType.SERVER) {
lineClass = "talk";
content = html`
You have been invited to ${createChannel(channel)} by ${createNick(msg.prefix.name)}
@@ -178,7 +191,7 @@ class LogLine extends Component {
return html`
- <${Timestamp} date=${new Date(msg.tags.time)} url=${getMessageURL(this.props.buffer, msg)}/>
+ <${Timestamp} date=${new Date(msg.tags.time)} url=${getMessageURL(buf, msg)}/>
${" "}
${content}
@@ -397,6 +410,7 @@ export default class Buffer extends Component {
render() {
let buf = this.props.buffer;
+ let server = this.props.server;
if (!buf) {
return null;
}
@@ -414,6 +428,7 @@ export default class Buffer extends Component {
key=${"msg-" + msg.key}
message=${msg}
buffer=${buf}
+ server=${server}
onChannelClick=${onChannelClick}
onNickClick=${onNickClick}
/>
@@ -447,6 +462,7 @@ export default class Buffer extends Component {
key=${"fold-" + msgs[0].key + "-" + msgs[msgs.length - 1].key}
messages=${msgs}
buffer=${buf}
+ server=${server}
onNickClick=${onNickClick}
/>
`;
diff --git a/components/member-list.js b/components/member-list.js
index e03e350..8f9b113 100644
--- a/components/member-list.js
+++ b/components/member-list.js
@@ -1,5 +1,6 @@
import { html, Component } from "../lib/index.js";
import { getNickURL } from "../state.js";
+import Membership from "./membership.js";
class MemberItem extends Component {
constructor(props) {
@@ -10,7 +11,7 @@ class MemberItem extends Component {
shouldComponentUpdate(nextProps) {
return this.props.nick !== nextProps.nick
- || this.props.membership != nextProps.membership;
+ || this.props.membership !== nextProps.membership;
}
handleClick(event) {
@@ -43,7 +44,10 @@ class MemberItem extends Component {
href=${getNickURL(this.props.nick)}
class="nick"
onClick=${this.handleClick}
- >${membership}${this.props.nick}
+ >
+ <${Membership} value=${this.props.membership}/>
+ ${this.props.nick}
+
`;
}
diff --git a/components/membership.js b/components/membership.js
new file mode 100644
index 0000000..36b3d73
--- /dev/null
+++ b/components/membership.js
@@ -0,0 +1,24 @@
+import { html, Component } from "../lib/index.js";
+
+// XXX: If we were feeling creative we could generate unique colors for
+// each item in ISUPPORT CHANMODES. But I am not feeling creative.
+const names = {
+ "~": "owner",
+ "&": "admin",
+ "@": "op",
+ "%": "halfop",
+ "+": "voice",
+};
+
+export default function Membership(props) {
+ if (!this.props.value) {
+ return null;
+ }
+
+ const name = names[this.props.value[0]] || "";
+ return html`
+
+ ${this.props.value}
+
+ `;
+}