summaryrefslogtreecommitdiff
path: root/Data/BuiltIn/Libraries/lua-addons/addons/answeringmachine/answeringmachine.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/answeringmachine/answeringmachine.lua')
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/answeringmachine/answeringmachine.lua212
1 files changed, 212 insertions, 0 deletions
diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/answeringmachine/answeringmachine.lua b/Data/BuiltIn/Libraries/lua-addons/addons/answeringmachine/answeringmachine.lua
new file mode 100644
index 0000000..7a86d27
--- /dev/null
+++ b/Data/BuiltIn/Libraries/lua-addons/addons/answeringmachine/answeringmachine.lua
@@ -0,0 +1,212 @@
+_addon.commands = {'answeringmachine','am'}
+_addon.name = 'AnsweringMachine'
+_addon.author = 'Byrth'
+_addon.version = '1.4'
+
+
+texts = require('texts')
+AM_box = texts.new('')
+AM_box:size(24)
+
+last_activity = os.time()
+unseen_message_count = 0
+
+textspeed = 0
+text_list = {[1]=os.time()}
+text_list[2] = text_list[1]
+text_list[3] = text_list[1]
+text_list[4] = text_list[1]
+text_list[5] = text_list[1]
+text_list[6] = text_list[1]
+text_list[7] = text_list[1]
+text_list[8] = text_list[1]
+text_list[9] = text_list[1]
+text_list[10] = text_list[1]
+text_index = 1
+
+recording = {}
+
+windower.register_event('addon command',function (...)
+ term = table.concat({...}, ' ')
+ local broken = split(term, ' ')
+ if broken[1] ~= nil then
+ if broken[1]:upper() == "CLEAR" then
+ if broken[2] == nil then
+ recording = {}
+ windower.add_to_chat(4,'Answering Machine>> Blanking the recordings')
+ elseif recording[broken[2]:upper()] then
+ windower.add_to_chat(4,'Answering Machine>> Deleting conversation with '..uc_first(broken[2]))
+ recording[broken[2]:upper()]=nil
+ else
+ windower.add_to_chat(5,'Cancel error: Could not find specified player in tell history')
+ end
+ elseif broken[1]:upper() == "LIST" then
+ local trig
+ for i,v in pairs(recording) do
+ windower.add_to_chat(5,#v..' exchange'..pl(#v)..' with '..uc_first(i))
+ trig = true
+ end
+ if not trig then
+ windower.add_to_chat(5,'No exchanges recorded.')
+ end
+ elseif broken[1]:upper() == "PLAY" then
+ if broken[2] then
+ if recording[broken[2]:upper()] then
+ local num = #recording[broken[2]:upper()]
+ windower.add_to_chat(5,num..' exchange'..pl(num)..'with '..uc_first(broken[2]))
+ print_messages(recording[broken[2]:upper()],broken[2])
+ end
+ else
+ windower.add_to_chat(4,'Answering Machine>> Playing back all messages')
+ for i,v in pairs(recording) do
+ windower.add_to_chat(5,#v..' exchange'..pl(#v)..' with '..uc_first(i))
+ print_messages(v,i)
+ end
+ end
+ elseif broken[1]:upper() == "HELP" then
+ print('am clear <name> : Clears current messages, or only messages from <name> if provided')
+ print('am help : Lists these commands!')
+ print('am list : Lists the names of people who have sent you tells')
+ print('am msg <message> : Sets your away message, which will be sent to non-GMs only once after plugin load or message clear')
+ print('am play <name> : Plays current messages, or only messages from <name> if provided')
+ elseif broken[1]:upper() == "MSG" then
+ table.remove(broken,1)
+ if #broken ~= 0 then
+ away_msg=table.concat(broken,' ')
+ windower.add_to_chat(123,'AnsweringMachine: Message set to: '..away_msg)
+ end
+ elseif broken[1] == 'box' and broken[2] == 'pos' and tonumber(broken[3]) and tonumber(broken[4]) then
+ AM_box:pos(tonumber(broken[3]),tonumber(broken[4]))
+ end
+ end
+end)
+
+windower.register_event('chat message',function(message,player,mode,isGM)
+ if mode==3 then
+ if recording[player:upper()] then
+ recording[player:upper()][#recording[player:upper()]+1] = {message=message,outgoing=false,timestamp=os.time(),seen=false}
+ else
+ recording[player:upper()] = {{message=message,outgoing=false,timestamp=os.time(),seen=false}}
+ if away_msg and not isGM then
+ windower.send_command('@input /tell '..player..' '..away_msg)
+ end
+ end
+ unseen_message_count = unseen_message_count + 1
+ end
+end)
+
+windower.register_event('outgoing chunk',function(id,original,modified,injected,blocked)
+ if not blocked and id == 0x0B6 then
+ local name = trim(original:sub(0x6,0x14))
+ local message = trim(original:sub(0x15))
+ if recording[name:upper()] then
+ recording[name:upper()][#recording[name:upper()]+1] = {message=message,outgoing=true,timestamp=os.time(),seen=true}
+ else
+ recording[name:upper()] = {{message=message,outgoing=true,timestamp=os.time(),seen=true}}
+ end
+ end
+end)
+
+windower.register_event('incoming text',function(org,mod,org_m,mod_m,blocked)
+ if not blocked then
+ text_list[text_index] = os.time()
+ text_index = text_index + 1
+ if text_index%11==0 then text_index = 1 end
+ end
+end)
+
+function split(msg, match)
+ local length = msg:len()
+ local splitarr = {}
+ local u = 1
+ while u < length do
+ local nextanch = msg:find(match,u)
+ if nextanch ~= nil then
+ splitarr[#splitarr+1] = msg:sub(u,nextanch-1)
+ if nextanch~=length then
+ u = nextanch+1
+ else
+ u = length
+ end
+ else
+ splitarr[#splitarr+1] = msg:sub(u,length)
+ u = length
+ end
+ end
+ return splitarr
+end
+
+function uc_first(msg)
+ local length = msg:len()
+ local first_char = msg:sub(1,1)
+ local rest = msg:sub(2,length)
+ return first_char:upper()..rest:lower()
+end
+
+function trim(msg)
+ for i=2,string.len(msg) do
+ if msg:byte(i) == 0 then
+ return msg:sub(1,i-1)
+ end
+ end
+ return msg
+end
+
+function pl(num)
+ if num > 1 then
+ return 's'
+ else
+ return ''
+ end
+end
+
+function arrows(bool,name)
+ if bool then
+ return name..'>> '
+ else
+ return '>>'..name..' : '
+ end
+end
+
+function print_messages(tab,name)
+ for p,q in ipairs(tab) do
+ windower.add_to_chat(4,os.date('%H:%M:%S',q.timestamp)..' '..arrows(q.outgoing,uc_first(name))..q.message)
+ tab[p].seen = true
+ end
+end
+
+windower.register_event('postrender',function()
+ AM_box:clear()
+ AM_box:append(unseen_message_count..' Message'..pl(unseen_message_count))
+ local t = os.clock()%1
+ AM_box:bg_color(255,150+100*math.sin(t*math.pi),150+100*math.sin(t*math.pi))
+ AM_box:color(0,0,0)
+ if unseen_message_count > 0 then
+ AM_box:show()
+ else
+ AM_box:hide()
+ end
+end)
+
+function activity()
+ last_activity = os.time()
+ if unseen_message_count > 0 then
+ local temp_message_count = 0
+ for i,v in pairs(recording) do
+ for n,m in pairs(v) do
+ if not m.seen then
+ if m.timestamp < text_list[((text_index+1)==11 and 1) or (text_index+1)] then
+ temp_message_count = temp_message_count + 1
+ else
+ recording[i][n].seen = true
+ end
+ end
+ end
+ end
+ unseen_message_count = temp_message_count
+ end
+end
+
+windower.register_event('keyboard',activity)
+
+windower.register_event('mouse',activity) \ No newline at end of file