local dirtylarry = require "dirtylarry/dirtylarry" local GOLDBARS_SMALL = "com.defold.iap.goldbar.small" local GOLDBARS_MEDIUM = "com.defold.iap.goldbar.medium" local GOLDBARS_LARGE = "com.defold.iap.goldbar.large" local SUBSCRIPTION = "com.defold.iap.subscription" local items = { GOLDBARS_SMALL, GOLDBARS_MEDIUM, GOLDBARS_LARGE, SUBSCRIPTION, } -- mapping between product id and button name local item_buttons = { [GOLDBARS_SMALL] = "goldbars_small", [GOLDBARS_MEDIUM] = "goldbars_medium", [GOLDBARS_LARGE] = "goldbars_large", [SUBSCRIPTION] = "subscription", } local available_items = {} local LOG = {} local function log(fmt, ...) if not fmt then return end local line = fmt:format(...) print(line) table.insert(LOG, line) if #LOG > 10 then table.remove(LOG, 1) end local s = table.concat(LOG, "\n") gui.set_text(gui.get_node("log"), s) end local function process_pending_transactions() log("iap.process_pending_transactions()") iap.process_pending_transactions() end local function buy(id) log("iap.buy() " .. id) iap.buy(id) end local function restore() log("iap.restore()") iap.restore() end local function list() log("iap.list()") for item, button in pairs(item_buttons) do gui.set_color(gui.get_node(button.."/larrylabel"), vmath.vector4(1,1,1,0.5)) end iap.list(items, function(self, products, error) if error then log(error.error) return end for k,p in pairs(products) do available_items[p.ident] = p log("Item %s", p.ident) local button = item_buttons[p.ident] if button then gui.set_color(gui.get_node(button.."/larrylabel"), vmath.vector4(1,1,1,1)) else log("Unable to find button for %s", tostring(p.ident)) end end end) end local function buy_listener(self, transaction, error) pprint(transaction) if error then log("iap.buy() error %s - %s", tostring(error.error), tostring(error.reason)) return end if iap.get_provider_id() == iap.PROVIDER_ID_GOOGLE and transaction.ident == NON_CONSUMABLE then log("iap.buy() ok - google") gui.set_color(gui.get_node("reset/larrylabel"), vmath.vector4(1,1,1,1)) product_items["reset"] = transaction else log("iap.buy() ok %s", transaction.ident) if self.finish then log("iap.finish() %s", transaction.ident) iap.finish(transaction) elseif self.acknowledge then log("iap.acknowledge() %s", transaction.ident) iap.acknowledge(transaction) end end end function init(self) self.log = {} self.finish = false self.acknowledge = false log("init()") msg.post(".", "acquire_input_focus") if not iap then log("In-App Purchases not supported") return end list() iap.set_listener(buy_listener) end function on_input(self, action_id, action) if action_id then for item, button in pairs(item_buttons) do if available_items[item] then dirtylarry:button(button, action_id, action, function() buy(item) end) end end dirtylarry:button("list", action_id, action, function() list() end) dirtylarry:button("restore", action_id, action, function() restore() end) dirtylarry:button("pending", action_id, action, function() process_pending_transactions() end) self.finish = dirtylarry:checkbox("chk_finish", action_id, action, self.finish) self.acknowledge = dirtylarry:checkbox("chk_acknowledge", action_id, action, self.acknowledge) end end