#include channels.js #include common.js #include user.js #include sound/umisound.js #include ui/channels.js #include ui/elems.js #include ui/messages.jsx #include ui/title.js #include ui/users.js #include ui/view.js Umi.UI.Hooks = (function() { return { AddMessageHooks: function() { Umi.Messages.OnSend.push(function(msg) { Umi.UI.View.SetText(''); }); Umi.Messages.OnRemove.push(function(msg) { Umi.UI.Messages.Remove(msg); }); Umi.Messages.OnClear.push(function() { Umi.UI.Messages.RemoveAll(); }); window.addEventListener('focus', function() { Umi.UI.Title.Clear(); }); Umi.Messages.OnAdd.push(function(msg) { Umi.UI.Channels.Unread(msg.getChannel()); Umi.UI.Messages.Add(msg); const settings = mami.getSettings(); if(!document.hidden && settings.get('flashTitle')) return; let title = ' ' + msg.getUser().getName(), channel = Umi.Channels.Current() || null; if(msg.getUser().isBot() && settings.get('showServerMsgInTitle')) title = ' ' + msg.getText(); if(channel !== null && channel.getName() !== msg.getChannel()) title += ' @ ' + channel.getName(); Umi.UI.Title.Flash(['[ @]' + title, '[@ ]' + title]); if(settings.get('enableNotifications') && Umi.User.getCurrentUser() !== null) { const triggers = (settings.get('notificationTriggers') || '').toLowerCase().split(' '), options = {}; triggers.push((Umi.User.getCurrentUser() || { getName: function() { return ''; } }).getName().toLowerCase()); options.body = 'Click here to see what they said.'; if(settings.get('notificationShowMessage')) options.body += "\n" + msg.getText(); const avatarUrl = futami.get('avatar'); if(avatarUrl.length > 0) options.icon = avatarUrl.replace('{user:id}', msg.getUser().getId()).replace('{resolution}', '80').replace('{user:avatar_change}', msg.getUser().getAvatarTime().toString()); for(const trigger of triggers) { const message = ' ' + msg.getText() + ' '; if(trigger.trim() === '') continue; if(message.toLowerCase().indexOf(' ' + trigger + ' ') >= 0) { new Notification('{0} mentioned you!'.replace('{0}', msg.getUser().getName()), options); if(settings.get('onlySoundOnMention')) Umi.Sound.Play('incoming'); break; } } } }); }, AddUserHooks: function() { Umi.Users.OnAdd.push(function(user) { Umi.UI.Users.Add(user); }); Umi.Users.OnRemove.push(function(user) { Umi.UI.Users.Remove(user); }); Umi.Users.OnClear.push(function() { Umi.UI.Users.RemoveAll(); }); Umi.Users.OnUpdate.push(function(id, user) { Umi.UI.Users.Update(user); }); }, AddChannelHooks: function() { Umi.Channels.OnAdd.push(function(channel) { Umi.UI.Channels.Add(channel); }); Umi.Channels.OnRemove.push(function(channel) { Umi.UI.Channels.Remove(channel); }); Umi.Channels.OnClear.push(function() { Umi.UI.Channels.RemoveAll(); }); Umi.Channels.OnUpdate.push(function(name, channel) { Umi.UI.Channels.Update(name, channel); }); Umi.Channels.OnSwitch.push(function(name, channel) { Umi.UI.Channels.Reload(name === null); }); }, AddTextHooks: function() { window.addEventListener('keydown', function(ev) { if(ev.ctrlKey || ev.altKey || ev.metaKey) return; const tagName = ev.target.tagName.toLowerCase(); if(tagName !== 'textarea' && tagName !== 'input') Umi.UI.Elements.MessageInput.focus(); }); Umi.UI.Elements.MessageInput.addEventListener('input', function(ev) { const elemInput = Umi.UI.Elements.MessageInput, elemParent = elemInput.parentNode; let height = 40; if(mami.getSettings().get('expandTextBox') && elemInput.scrollHeight > elemInput.clientHeight) { /*const cols = Math.floor(elemInput.clientWidth / 8), rows = Math.floor(elemInput.textLength / cols); if(rows > 1) height = 15.5 * (rows + 1);*/ height = elemInput.scrollHeight; } if(height > 40) elemParent.style.height = height.toString() + 'px'; else elemParent.style.height = null; }); Umi.UI.Elements.MessageInput.addEventListener('keydown', function(ev) { switch(ev.key) { case 'Tab': if(!ev.shiftKey || !ev.ctrlKey) { ev.preventDefault(); const text = Umi.UI.View.GetText(); if(text.length > 0) { const start = Umi.UI.View.GetPosition(); let position = start, snippet = ''; while(position >= 0 && text.charAt(position - 1) !== ' ' && text.charAt(position - 1) !== "\n") { --position; snippet = text.charAt(position) + snippet; } let insertText = undefined; if(snippet.indexOf(':') === 0) { let emoteRank = 0; if(Umi.User.hasCurrentUser()) emoteRank = Umi.User.getCurrentUser().getRank(); const emotes = MamiEmotes.findByName(emoteRank, snippet.substring(1), true); if(emotes.length > 0) insertText = ':' + emotes[0] + ':'; } else { const users = Umi.Users.Find(snippet); if(users.length === 1) insertText = users[0].getName(); } if(insertText !== undefined) { Umi.UI.View.SetText(text.slice(0, start - snippet.length) + text.slice(start)); Umi.UI.View.SetPosition(start - snippet.length); Umi.UI.View.EnterAtCursor(insertText); Umi.UI.View.SetPosition(Umi.UI.View.GetPosition() + insertText.length); Umi.UI.View.SetPosition(Umi.UI.View.GetPosition(), true); } } } break; case 'Enter': case 'NumpadEnter': if(!ev.shiftKey) { ev.preventDefault(); Umi.Messages.Send(Umi.UI.Elements.MessageInput.value); return; } break; } }); Umi.UI.Elements.MessageSend.addEventListener('click', function(ev) { Umi.Messages.Send(Umi.UI.Elements.MessageInput.value); }); }, }; })();