diff --git a/modules/game_console/communicationwindow.otui b/modules/game_console/communicationwindow.otui new file mode 100644 index 00000000..751323ee --- /dev/null +++ b/modules/game_console/communicationwindow.otui @@ -0,0 +1,206 @@ +IgnoreListLabel < Label + font: verdana-11px-monochrome + background-color: alpha + text-offset: 2 0 + focusable: true + phantom: false + + $focus: + background-color: #ffffff22 + color: #ffffff + +WhiteListLabel < Label + font: verdana-11px-monochrome + background-color: alpha + text-offset: 2 0 + focusable: true + phantom: false + + $focus: + background-color: #ffffff22 + color: #ffffff + + +MainWindow + id: communicationWindow + !text: tr('Ignore List') + size: 515 410 + @onEscape: self:destroy() + + CheckBox + id: checkboxUseIgnoreList + !text: tr('Activate ignorelist') + anchors.left: parent.left + anchors.top: parent.top + width: 180 + + Label + !text: tr('Ignored Players:') + anchors.left: parent.left + anchors.top: prev.bottom + margin-top: 10 + + TextList + id: ignoreList + vertical-scrollbar: ignoreListScrollBar + anchors.left: parent.left + anchors.top: prev.bottom + height: 150 + width: 230 + margin-bottom: 10 + margin-top: 3 + padding: 1 + focusable: false + + TextEdit + id: ignoreNameEdit + anchors.top: prev.bottom + anchors.left: parent.left + width: 110 + margin-top: 5 + + Button + id: buttonIgnoreAdd + !text: tr('Add') + width: 48 + height: 20 + margin-left: 5 + anchors.top: prev.top + anchors.left: prev.right + + Button + id: buttonIgnoreRemove + !text: tr('Remove') + width: 64 + height: 20 + margin-left: 5 + anchors.top: prev.top + anchors.left: prev.right + + Label + !text: tr('Global ignore settings') + anchors.left: parent.left + anchors.top: prev.bottom + margin-top: 20 + + CheckBox + id: checkboxIgnorePrivateMessages + !text: tr('Ignore Private Messages') + anchors.left: parent.left + anchors.top: prev.bottom + width: 180 + margin-top: 5 + + CheckBox + id: checkboxIgnoreYelling + !text: tr('Ignore Yelling') + anchors.left: parent.left + anchors.top: prev.bottom + width: 180 + margin-top: 5 + + CheckBox + id: checkboxUseWhiteList + !text: tr('Activate whitelist') + anchors.top: parent.top + anchors.left: ignoreList.right + margin-left: 20 + width: 180 + + Label + !text: tr('Allowed Players:') + anchors.top: prev.bottom + anchors.left: prev.left + margin-top: 10 + + TextList + id: whiteList + vertical-scrollbar: whiteListScrollBar + anchors.left: prev.left + anchors.top: prev.bottom + height: 150 + width: 230 + margin-bottom: 10 + margin-top: 3 + padding: 1 + focusable: false + + TextEdit + id: whitelistNameEdit + anchors.top: prev.bottom + anchors.left: prev.left + width: 110 + margin-top: 5 + + Button + id: buttonWhitelistAdd + !text: tr('Add') + width: 48 + height: 20 + margin-left: 5 + anchors.top: prev.top + anchors.left: prev.right + + Button + id: buttonWhitelistRemove + !text: tr('Remove') + width: 64 + height: 20 + margin-left: 5 + anchors.top: prev.top + anchors.left: prev.right + + Label + !text: tr('Global whitelist settings') + anchors.left: whiteList.left + anchors.top: prev.bottom + margin-top: 20 + + CheckBox + id: checkboxAllowVIPs + !text: tr('Allow VIPs to message you') + anchors.left: prev.left + anchors.top: prev.bottom + width: 180 + margin-top: 5 + + Panel + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + height: 30 + + Panel + size: 160 30 + anchors.horizontalCenter: parent.horizontalCenter + + Button + id: buttonSave + !text: tr('Save') + width: 75 + anchors.top: parent.top + anchors.left: parent.left + + Button + id: buttonCancel + !text: tr('Cancel') + width: 75 + anchors.top: parent.top + anchors.left: prev.right + margin-left: 10 + + VerticalScrollBar + id: ignoreListScrollBar + anchors.top: ignoreList.top + anchors.bottom: ignoreList.bottom + anchors.right: ignoreList.right + step: 14 + pixels-scroll: true + + VerticalScrollBar + id: whiteListScrollBar + anchors.top: whiteList.top + anchors.bottom: whiteList.bottom + anchors.right: whiteList.right + step: 14 + pixels-scroll: true diff --git a/modules/game_console/console.lua b/modules/game_console/console.lua index 82d485c8..0e496eab 100644 --- a/modules/game_console/console.lua +++ b/modules/game_console/console.lua @@ -61,7 +61,7 @@ consoleTabBar = nil consoleTextEdit = nil channels = nil channelsWindow = nil -ignoreWindow = nil +communicationWindow = nil ownPrivateName = nil messageHistory = {} currentMessageIndex = 0 @@ -74,10 +74,14 @@ violationReportTab = nil ignoredChannels = {} filters = {} -local ignoreSettings = { +local communicationSettings = { + useIgnoreList = true, + useWhiteList = true, privateMessages = false, yelling = false, - players = {} + allowVIPs = false, + ignoredPlayers = {}, + whitelistedPlayers = {} } function init() @@ -166,14 +170,14 @@ function terminate() g_keyboard.unbindKeyDown('Ctrl+E') g_keyboard.unbindKeyDown('Ctrl+H') - saveIgnoreSettings() + saveCommunicationSettings() if channelsWindow then channelsWindow:destroy() end - if ignoreWindow then - ignoreWindow:destroy() + if communicationWindow then + communicationWindow:destroy() end if violationWindow then @@ -197,7 +201,7 @@ function load() if settings then messageHistory = settings.messageHistory or {} end - loadIgnoreSettings() + loadCommunicationSettings() end function onTabChange(tabBar, tab) @@ -779,7 +783,11 @@ function onTalk(name, level, mode, message, channelId, creaturePos) return end - if name ~= g_game.getCharacterName() then + local localPlayer = g_game.getLocalPlayer() + if name ~= g_game.getCharacterName() + and isUsingIgnoreList() + and not(isUsingWhiteList()) or (isUsingWhiteList() and not(isWhitelisted(name)) and not(isAllowingVIPs() and localPlayer:hasVip(name))) then + if mode == MessageModes.Yell and isIgnoringYelling() then return elseif speaktype.private and isIgnoringPrivate() and mode ~= MessageModes.NpcFrom then @@ -957,107 +965,221 @@ function onChannelList(channelList) end end -function loadIgnoreSettings() +function loadCommunicationSettings() + communicationSettings.whitelistedPlayers = {} + communicationSettings.ignoredPlayers = {} + local ignoreNode = g_settings.getNode('IgnorePlayers') if ignoreNode then for i = 1, #ignoreNode do - table.insert(ignoreSettings.players, ignoreNode[i]) + table.insert(communicationSettings.ignoredPlayers, ignoreNode[i]) + end + end + + local whitelistNode = g_settings.getNode('WhitelistedPlayers') + if whitelistNode then + for i = 1, #whitelistNode do + table.insert(communicationSettings.whitelistedPlayers, whitelistNode[i]) end end - ignoreSettings.privateMessages = g_settings.getBoolean('IgnorePrivateMessages') - ignoreSettings.yelling = g_settings.getBoolean('IgnoreYelling') + + communicationSettings.useIgnoreList = g_settings.getBoolean('UseIgnoreList') + communicationSettings.useWhiteList = g_settings.getBoolean('UseWhiteList') + communicationSettings.privateMessages = g_settings.getBoolean('IgnorePrivateMessages') + communicationSettings.yelling = g_settings.getBoolean('IgnoreYelling') + communicationSettings.allowVIPs = g_settings.getBoolean('AllowVIPs') end -function saveIgnoreSettings() - local tmpSettings = {} - for i = 1, #ignoreSettings.players do - table.insert(tmpSettings, ignoreSettings.players[i]) +function saveCommunicationSettings() + local tmpIgnoreList = {} + local ignoredPlayers = getIgnoredPlayers() + for i = 1, #ignoredPlayers do + table.insert(tmpIgnoreList, ignoredPlayers[i]) end - g_settings.set('IgnorePrivateMessages', ignoreSettings.privateMessages) - g_settings.set('IgnoreYelling', ignoreSettings.yelling) - g_settings.setNode('IgnorePlayers', tmpSettings) + + local tmpWhiteList = {} + local whitelistedPlayers = getWhitelistedPlayers() + for i = 1, #whitelistedPlayers do + table.insert(tmpWhiteList, whitelistedPlayers[i]) + end + + g_settings.set('UseIgnoreList', communicationSettings.useIgnoreList) + g_settings.set('UseWhiteList', communicationSettings.useWhiteList) + g_settings.set('IgnorePrivateMessages', communicationSettings.privateMessages) + g_settings.set('IgnoreYelling', communicationSettings.yelling) + g_settings.setNode('IgnorePlayers', tmpIgnoreList) + g_settings.setNode('WhitelistedPlayers', tmpWhiteList) +end + +function getIgnoredPlayers() + return communicationSettings.ignoredPlayers end +function getWhitelistedPlayers() + return communicationSettings.whitelistedPlayers +end + +function isUsingIgnoreList() + return communicationSettings.useIgnoreList +end + +function isUsingWhiteList() + return communicationSettings.useWhiteList +end function isIgnored(name) - return table.find(ignoreSettings.players, name, true) + return table.find(communicationSettings.ignoredPlayers, name, true) end function addIgnoredPlayer(name) - if not isIgnored(name) then - table.insert(ignoreSettings.players, name) - end + if isIgnored(name) then return end + table.insert(communicationSettings.ignoredPlayers, name) end function removeIgnoredPlayer(name) - table.removevalue(ignoreSettings.players, name) + table.removevalue(communicationSettings.ignoredPlayers, name) +end + +function isWhitelisted(name) + return table.find(communicationSettings.whitelistedPlayers, name, true) +end + +function addWhitelistedPlayer(name) + if isWhitelisted(name) then return end + table.insert(communicationSettings.whitelistedPlayers, name) +end + +function removeWhitelistedPlayer(name) + table.removevalue(communicationSettings.whitelistedPlayers, name) end function isIgnoringPrivate() - return ignoreSettings.privateMessages + return communicationSettings.privateMessages end function isIgnoringYelling() - return ignoreSettings.yelling + return communicationSettings.yelling +end + +function isAllowingVIPs() + return communicationSettings.allowVIPs end function onClickIgnoreButton() - if ignoreWindow then return end - ignoreWindow = g_ui.displayUI('ignorewindow') - local ignoreListPanel = ignoreWindow:getChildById('ignoreList') - ignoreWindow.onDestroy = function() ignoreWindow = nil end + if communicationWindow then return end + communicationWindow = g_ui.displayUI('communicationwindow') + local ignoreListPanel = communicationWindow:getChildById('ignoreList') + local whiteListPanel = communicationWindow:getChildById('whiteList') + communicationWindow.onDestroy = function() communicationWindow = nil end - local removeButton = ignoreWindow:getChildById('buttonRemove') - removeButton:disable() - ignoreListPanel.onChildFocusChange = function() removeButton:enable() end - removeButton.onClick = function() + local useIgnoreListBox = communicationWindow:getChildById('checkboxUseIgnoreList') + useIgnoreListBox:setChecked(communicationSettings.useIgnoreList) + local useWhiteListBox = communicationWindow:getChildById('checkboxUseWhiteList') + useWhiteListBox:setChecked(communicationSettings.useWhiteList) + + local removeIgnoreButton = communicationWindow:getChildById('buttonIgnoreRemove') + removeIgnoreButton:disable() + ignoreListPanel.onChildFocusChange = function() removeIgnoreButton:enable() end + removeIgnoreButton.onClick = function() local selection = ignoreListPanel:getFocusedChild() if selection then - ignoreListPanel:removeChild(selection) - selection:destroy() + ignoreListPanel:removeChild(selection) + selection:destroy() end - if ignoreListPanel:getChildCount() == 0 then - removeButton:disable() + removeIgnoreButton:disable() + end + + local removeWhitelistButton = communicationWindow:getChildById('buttonWhitelistRemove') + removeWhitelistButton:disable() + whiteListPanel.onChildFocusChange = function() removeWhitelistButton:enable() end + removeWhitelistButton.onClick = function() + local selection = whiteListPanel:getFocusedChild() + if selection then + whiteListPanel:removeChild(selection) + selection:destroy() end + removeWhitelistButton:disable() end local newlyIgnoredPlayers = {} - local addName = ignoreWindow:getChildById('ignoreNameEdit') - local addButton = ignoreWindow:getChildById('buttonAdd') - local addFunction = function() - if addName:getText() == '' then return end - if table.find(ignoreSettings.players, addName:getText()) then return end - if table.find(newlyIgnoredPlayers, addName:getText()) then return end - local label = g_ui.createWidget('IgnoreListLabel', ignoreListPanel) - label:setText(addName:getText()) - table.insert(newlyIgnoredPlayers, addName:getText()) - label:setPhantom(false) - addName:setText('') - end - addButton.onClick = addFunction - ignoreWindow.onEnter = addFunction + local addIgnoreName = communicationWindow:getChildById('ignoreNameEdit') + local addIgnoreButton = communicationWindow:getChildById('buttonIgnoreAdd') + local addIgnoreFunction = function() + local newEntry = addIgnoreName:getText() + if newEntry == '' then return end + if table.find(getIgnoredPlayers(), newEntry) then return end + if table.find(newlyIgnoredPlayers, newEntry) then return end + local label = g_ui.createWidget('IgnoreListLabel', ignoreListPanel) + label:setText(newEntry) + table.insert(newlyIgnoredPlayers, newEntry) + addIgnoreName:setText('') + end + addIgnoreButton.onClick = addIgnoreFunction + + local newlyWhitelistedPlayers = {} + local addWhitelistName = communicationWindow:getChildById('whitelistNameEdit') + local addWhitelistButton = communicationWindow:getChildById('buttonWhitelistAdd') + local addWhitelistFunction = function() + local newEntry = addWhitelistName:getText() + if newEntry == '' then return end + if table.find(getWhitelistedPlayers(), newEntry) then return end + if table.find(newlyWhitelistedPlayers, newEntry) then return end + local label = g_ui.createWidget('WhiteListLabel', whiteListPanel) + label:setText(newEntry) + table.insert(newlyWhitelistedPlayers, newEntry) + addWhitelistName:setText('') + end + addWhitelistButton.onClick = addWhitelistFunction + + communicationWindow.onEnter = function() + if addWhitelistName:isFocused() then + addWhitelistFunction() + elseif addIgnoreName:isFocused() then + addIgnoreFunction() + end + end - local ignorePrivateMessageBox = ignoreWindow:getChildById('checkboxIgnorePrivateMessages') - ignorePrivateMessageBox:setChecked(ignoreSettings.privateMessages) - local ignoreYellingBox = ignoreWindow:getChildById('checkboxIgnoreYelling') - ignoreYellingBox:setChecked(ignoreSettings.yelling) + local ignorePrivateMessageBox = communicationWindow:getChildById('checkboxIgnorePrivateMessages') + ignorePrivateMessageBox:setChecked(communicationSettings.privateMessages) + local ignoreYellingBox = communicationWindow:getChildById('checkboxIgnoreYelling') + ignoreYellingBox:setChecked(communicationSettings.yelling) + local allowVIPsBox = communicationWindow:getChildById('checkboxAllowVIPs') + allowVIPsBox:setChecked(communicationSettings.allowVIPs) - local saveButton = ignoreWindow:getChildById('buttonSave') + local saveButton = communicationWindow:recursiveGetChildById('buttonSave') saveButton.onClick = function() - ignoreSettings.players = {} - for i = 1, ignoreListPanel:getChildCount() do - addIgnoredPlayer(ignoreListPanel:getChildByIndex(i):getText()) - --table.insert(ignoreSettings.players, ignoreListPanel:getChildByIndex(i):getText()) - end - - ignoreSettings.yelling = ignoreYellingBox:isChecked() - ignoreSettings.privateMessages = ignorePrivateMessageBox:isChecked() - ignoreWindow:destroy() - end + communicationSettings.ignoredPlayers = {} + for i = 1, ignoreListPanel:getChildCount() do + addIgnoredPlayer(ignoreListPanel:getChildByIndex(i):getText()) + end + + communicationSettings.whitelistedPlayers = {} + for i = 1, whiteListPanel:getChildCount() do + addWhitelistedPlayer(whiteListPanel:getChildByIndex(i):getText()) + end + + communicationSettings.useIgnoreList = useIgnoreListBox:isChecked() + communicationSettings.useWhiteList = useWhiteListBox:isChecked() + communicationSettings.yelling = ignoreYellingBox:isChecked() + communicationSettings.privateMessages = ignorePrivateMessageBox:isChecked() + communicationSettings.allowVIPs = allowVIPsBox:isChecked() + communicationWindow:destroy() + end + + local cancelButton = communicationWindow:recursiveGetChildById('buttonCancel') + cancelButton.onClick = function() + communicationWindow:destroy() + end - for _, name in pairs(ignoreSettings.players) do - local label = g_ui.createWidget('IgnoreListLabel', ignoreListPanel) - label:setText(name) - label:setPhantom(false) + local ignoredPlayers = getIgnoredPlayers() + for i = 1, #ignoredPlayers do + local label = g_ui.createWidget('IgnoreListLabel', ignoreListPanel) + label:setText(ignoredPlayers[i]) + end + + local whitelistedPlayers = getWhitelistedPlayers() + for i = 1, #whitelistedPlayers do + local label = g_ui.createWidget('WhiteListLabel', whiteListPanel) + label:setText(whitelistedPlayers[i]) end end diff --git a/modules/game_console/ignorewindow.otui b/modules/game_console/ignorewindow.otui deleted file mode 100644 index 47a1d84f..00000000 --- a/modules/game_console/ignorewindow.otui +++ /dev/null @@ -1,98 +0,0 @@ -IgnoreListLabel < Label - font: verdana-11px-monochrome - background-color: alpha - text-offset: 2 0 - focusable: true - - $focus: - background-color: #ffffff22 - color: #ffffff - -MainWindow - id: ignoreWindow - !text: tr('Ignore List') - size: 500 240 - @onEscape: self:destroy() - - Label - !text: tr('Ignored players:') - anchors.left: parent.left - anchors.top: parent.top - - TextList - id: ignoreList - vertical-scrollbar: ignoreListScrollBar - anchors.left: parent.left - anchors.top: prev.bottom - height: 150 - width: 230 - margin-bottom: 10 - margin-top: 3 - padding: 1 - focusable: false - - Button - id: buttonRemove - !text: tr('Remove') - width: 64 - anchors.right: prev.right - anchors.bottom: parent.bottom - - TextEdit - id: ignoreNameEdit - anchors.left: ignoreList.right - anchors.top: ignoreList.top - width: 180 - margin-left: 8 - margin-right: 3 - - Button - id: buttonAdd - !text: tr('Add') - width: 48 - height: 20 - anchors.right: parent.right - anchors.top: prev.top - - CheckBox - id: checkboxIgnorePrivateMessages - !text: tr('Ignore Private Messages') - anchors.left: ignoreList.right - anchors.top: ignoreList.top - width: 180 - margin-top: 25 - margin-left: 8 - - CheckBox - id: checkboxIgnoreYelling - !text: tr('Ignore Yelling') - anchors.left: ignoreList.right - anchors.top: prev.top - width: 180 - margin-top: 25 - margin-left: 8 - - Button - id: buttonSave - !text: tr('Save') - width: 64 - anchors.right: next.left - anchors.bottom: parent.bottom - margin-right: 10 - @onClick: self:getParent():onEnter() - - Button - id: buttonCancel - !text: tr('Cancel') - width: 64 - anchors.right: parent.right - anchors.bottom: parent.bottom - @onClick: self:getParent():destroy() - - VerticalScrollBar - id: ignoreListScrollBar - anchors.top: ignoreList.top - anchors.bottom: ignoreList.bottom - anchors.right: ignoreList.right - step: 14 - pixels-scroll: true