package com.recycleai; import android.app.Activity; import com.google.appinventor.components.annotations.*; import com.google.appinventor.components.common.*; import com.google.appinventor.components.runtime.*; import com.google.appinventor.components.runtime.util.AsynchUtil; import com.google.appinventor.components.runtime.util.YailList; import org.json.JSONObject; import org.json.JSONArray; import java.io.OutputStream; import java.io.InputStreamReader; import java.io.BufferedReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.ArrayList; import java.util.List; @DesignerComponent( version = 4, description = "Extension to query ChatGPT and get recycling information", category = ComponentCategory.EXTENSION, nonVisible = true, iconName = "") @SimpleObject(external = true) public class RecycleAI extends AndroidNonvisibleComponent implements Component { private String apiKey = ""; private final String API_URL = "https://api.openai.com/v1/chat/completions"; private final Activity activity; private static final HashMap RECYCLING_CODE_MAP = new HashMap<>(); static { RECYCLING_CODE_MAP.put("01", new String[]{"PET", "Plastic"}); RECYCLING_CODE_MAP.put("02", new String[]{"HDPE", "Plastic"}); RECYCLING_CODE_MAP.put("02", new String[]{"PEHD", "Plastic"}); RECYCLING_CODE_MAP.put("03", new String[]{"PVC", "Plastic"}); RECYCLING_CODE_MAP.put("04", new String[]{"LDPE", "Plastic"}); RECYCLING_CODE_MAP.put("04", new String[]{"PELD", "Plastic"}); RECYCLING_CODE_MAP.put("05", new String[]{"PP", "Plastic"}); RECYCLING_CODE_MAP.put("06", new String[]{"PS", "Plastic"}); RECYCLING_CODE_MAP.put("ABS", new String[]{"ABS", "Plastic"}); RECYCLING_CODE_MAP.put("PA", new String[]{"PA", "Plastic"}); RECYCLING_CODE_MAP.put("08", new String[]{"LEAD", "Battery"}); RECYCLING_CODE_MAP.put("09", new String[]{"ALKALINE", "Battery"}); RECYCLING_CODE_MAP.put("10", new String[]{"NiCD", "Battery"}); RECYCLING_CODE_MAP.put("11", new String[]{"NiMH", "Battery"}); RECYCLING_CODE_MAP.put("12", new String[]{"Li", "Battery"}); RECYCLING_CODE_MAP.put("13", new String[]{"SO(Z)", "Battery"}); RECYCLING_CODE_MAP.put("14", new String[]{"CZ", "Battery"}); RECYCLING_CODE_MAP.put("20", new String[]{"PAP", "Paper"}); RECYCLING_CODE_MAP.put("21", new String[]{"PAP", "Paper"}); RECYCLING_CODE_MAP.put("22", new String[]{"PAP", "Paper"}); RECYCLING_CODE_MAP.put("40", new String[]{"FE", "Metal"}); RECYCLING_CODE_MAP.put("41", new String[]{"ALU", "Metal"}); RECYCLING_CODE_MAP.put("50", new String[]{"FOR", "Biomatter"}); RECYCLING_CODE_MAP.put("51", new String[]{"FOR", "Biomatter"}); RECYCLING_CODE_MAP.put("60", new String[]{"COT", "Biomatter"}); RECYCLING_CODE_MAP.put("61", new String[]{"TEX", "Biomatter"}); RECYCLING_CODE_MAP.put("70", new String[]{"GL", "Glass"}); RECYCLING_CODE_MAP.put("70", new String[]{"GL70", "Glass"}); RECYCLING_CODE_MAP.put("71", new String[]{"GL71", "Glass"}); RECYCLING_CODE_MAP.put("72", new String[]{"GL72", "Glass"}); RECYCLING_CODE_MAP.put("73", new String[]{"GL73", "Glass"}); RECYCLING_CODE_MAP.put("74", new String[]{"GL74", "Glass"}); RECYCLING_CODE_MAP.put("75", new String[]{"GL75", "Glass"}); RECYCLING_CODE_MAP.put("76", new String[]{"GL76", "Glass"}); RECYCLING_CODE_MAP.put("77", new String[]{"GL77", "Glass"}); RECYCLING_CODE_MAP.put("78", new String[]{"GL78", "Glass"}); RECYCLING_CODE_MAP.put("79", new String[]{"GL79", "Glass"}); RECYCLING_CODE_MAP.put("80", new String[]{"PAP", "Paper"}); RECYCLING_CODE_MAP.put("84", new String[]{"C/PAP", "Paper"}); RECYCLING_CODE_MAP.put("87", new String[]{"CSL", "Composite"}); RECYCLING_CODE_MAP.put("90", new String[]{"C/LDPE", "Plastic"}); RECYCLING_CODE_MAP.put("90", new String[]{"C/PELD", "Plastic"}); RECYCLING_CODE_MAP.put("92", new String[]{"C/FE", "Metal"}); RECYCLING_CODE_MAP.put("20", new String[]{"PAP20", "Paper"}); RECYCLING_CODE_MAP.put("21", new String[]{"PAP21", "Paper"}); RECYCLING_CODE_MAP.put("22", new String[]{"PAP22", "Paper"}); RECYCLING_CODE_MAP.put("01", new String[]{"PET1", "Plastic"}); RECYCLING_CODE_MAP.put("02", new String[]{"HDPE2", "Plastic"}); RECYCLING_CODE_MAP.put("02", new String[]{"PEHD2", "Plastic"}); RECYCLING_CODE_MAP.put("03", new String[]{"PVC3", "Plastic"}); RECYCLING_CODE_MAP.put("04", new String[]{"LDPE4", "Plastic"}); RECYCLING_CODE_MAP.put("04", new String[]{"PELD4", "Plastic"}); RECYCLING_CODE_MAP.put("05", new String[]{"PP5", "Plastic"}); RECYCLING_CODE_MAP.put("06", new String[]{"PS6", "Plastic"}); } private static final String RECYCLING_DATA = "[" + "{\"codice\": \"01PET\", \"materiale\": {\"it\": \"Polietilene tereftalato\", \"en\": \"Polyethylene terephthalate\", \"es\": \"Tereftalato de polietileno\", \"fr\": \"Polyéthylène téréphtalate\", \"de\": \"Polyethylenterephthalat\", \"pt\": \"Polietileno tereftalato\"}, \"uso_comune\": {\"it\": \"Bottiglie per bevande, contenitori alimentari\", \"en\": \"Beverage bottles, food containers\", \"es\": \"Botellas de bebidas, envases de alimentos\", \"fr\": \"Bouteilles de boissons, contenants alimentaires\", \"de\": \"Getränkeflaschen, Lebensmittelbehälter\", \"pt\": \"Garrafas de bebidas, recipientes de alimentos\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile ampiamente\", \"en\": \"Widely recyclable\", \"es\": \"Ampliamente reciclable\", \"fr\": \"Largement recyclable\", \"de\": \"Weitgehend recycelbar\", \"pt\": \"Amplamente reciclável\"}}," + "{\"codice\": \"02HDPE\", \"materiale\": {\"it\": \"Polietilene ad alta densità\", \"en\": \"High-density polyethylene\", \"es\": \"Polietileno de alta densidad\", \"fr\": \"Polyéthylène haute densité\", \"de\": \"Polyethylen hoher Dichte\", \"pt\": \"Polietileno de alta densidade\"}, \"uso_comune\": {\"it\": \"Contenitori per latte, detersivi, giocattoli\", \"en\": \"Milk jugs, detergent bottles, toys\", \"es\": \"Envases de leche, botellas de detergente, juguetes\", \"fr\": \"Pots de lait, bouteilles de détergent, jouets\", \"de\": \"Milchkannen, Reinigungsmittelflaschen, Spielzeug\", \"pt\": \"Recipientes de leite, frascos de detergente, brinquedos\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile ampiamente\", \"en\": \"Widely recyclable\", \"es\": \"Ampliamente reciclable\", \"fr\": \"Largement recyclable\", \"de\": \"Weitgehend recycelbar\", \"pt\": \"Amplamente reciclável\"}}," + "{\"codice\": \"03PVC\", \"materiale\": {\"it\": \"Cloruro di polivinile\", \"en\": \"Polyvinyl chloride\", \"es\": \"Cloruro de polivinilo\", \"fr\": \"Chlorure de polyvinyle\", \"de\": \"Polyvinylchlorid\", \"pt\": \"Cloreto de polivinila\"}, \"uso_comune\": {\"it\": \"Tubi, rivestimenti per cavi, giocattoli\", \"en\": \"Pipes, cable insulation, toys\", \"es\": \"Tuberías, revestimientos de cables, juguetes\", \"fr\": \"Tuyaux, isolations de câbles, jouets\", \"de\": \"Rohre, Kabelisolierungen, Spielzeug\", \"pt\": \"Tubos, revestimentos de cabos, brinquedos\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile raramente, contiene cloro\", \"en\": \"Rarely recyclable, contains chlorine\", \"es\": \"Raramente reciclable, contiene cloro\", \"fr\": \"Rarement recyclable, contient du chlore\", \"de\": \"Selten recycelbar, enthält Chlor\", \"pt\": \"Raramente reciclável, contém cloro\"}}," + "{\"codice\": \"04LDPE\", \"materiale\": {\"it\": \"Polietilene a bassa densità\", \"en\": \"Low-density polyethylene\", \"es\": \"Polietileno de baja densidad\", \"fr\": \"Polyéthylène basse densité\", \"de\": \"Polyethylen niedriger Dichte\", \"pt\": \"Polietileno de baixa densidade\"}, \"uso_comune\": {\"it\": \"Sacchetti di plastica, pellicole, imballaggi\", \"en\": \"Plastic bags, films, packaging\", \"es\": \"Bolsas de plástico, películas, embalajes\", \"fr\": \"Sacs en plastique, films, emballages\", \"de\": \"Plastiktüten, Folien, Verpackungen\", \"pt\": \"Sacos de plástico, filmes, embalagens\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile ampiamente\", \"en\": \"Widely recyclable\", \"es\": \"Ampliamente reciclable\", \"fr\": \"Largement recyclable\", \"de\": \"Weitgehend recycelbar\", \"pt\": \"Amplamente reciclável\"}}," + "{\"codice\": \"05PP\", \"materiale\": {\"it\": \"Polipropilene\", \"en\": \"Polypropylene\", \"es\": \"Polipropileno\", \"fr\": \"Polypropylène\", \"de\": \"Polypropylen\", \"pt\": \"Polipropileno\"}, \"uso_comune\": {\"it\": \"Contenitori per alimenti, tappi, mobili da giardino\", \"en\": \"Food containers, caps, garden furniture\", \"es\": \"Recipientes para alimentos, tapas, muebles de jardín\", \"fr\": \"Contenants alimentaires, bouchons, mobilier de jardin\", \"de\": \"Lebensmittelbehälter, Verschlüsse, Gartenmöbel\", \"pt\": \"Recipientes para alimentos, tampas, móveis de jardim\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile ampiamente\", \"en\": \"Widely recyclable\", \"es\": \"Ampliamente reciclable\", \"fr\": \"Largement recyclable\", \"de\": \"Weitgehend recycelbar\", \"pt\": \"Amplamente reciclável\"}}," + "{\"codice\": \"06PS\", \"materiale\": {\"it\": \"Polistirene\", \"en\": \"Polystyrene\", \"es\": \"Poliestireno\", \"fr\": \"Polystyrène\", \"de\": \"Polystyrol\", \"pt\": \"Poliestireno\"}, \"uso_comune\": {\"it\": \"Contenitori per alimenti take-away, imballaggi\", \"en\": \"Take-away food containers, packaging\", \"es\": \"Recipientes para alimentos para llevar, embalajes\", \"fr\": \"Contenants alimentaires à emporter, emballages\", \"de\": \"Take-away-Lebensmittelbehälter, Verpackungen\", \"pt\": \"Recipientes para alimentos para levar, embalagens\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile raramente, difficile da riciclare\", \"en\": \"Rarely recyclable, difficult to recycle\", \"es\": \"Raramente reciclable, difícil de reciclar\", \"fr\": \"Rarement recyclable, difficile à recycler\", \"de\": \"Selten recycelbar, schwierig zu recyceln\", \"pt\": \"Raramente reciclável, difícil de reciclar\"}}," + "{\"codice\": \"07OTHER\", \"materiale\": {\"it\": \"Altri tipi di plastica\", \"en\": \"Other types of plastic\", \"es\": \"Otros tipos de plástico\", \"fr\": \"Autres types de plastique\", \"de\": \"Andere Kunststoffarten\", \"pt\": \"Outros tipos de plástico\"}, \"uso_comune\": {\"it\": \"Prodotti vari, miscele di plastiche\", \"en\": \"Various products, mixtures of plastics\", \"es\": \"Productos varios, mezclas de plásticos\", \"fr\": \"Produits divers, mélanges de plastiques\", \"de\": \"Verschiedene Produkte, Kunststoffmischungen\", \"pt\": \"Produtos diversos, misturas de plásticos\"}, \"riciclabile\": false, \"note\": {\"it\": \"Riciclabile raramente, difficile da identificare\", \"en\": \"Rarely recyclable, difficult to identify\", \"es\": \"Raramente reciclable, difícil de identificar\", \"fr\": \"Rarement recyclable, difficile à identifier\", \"de\": \"Selten recycelbar, schwer zu identifizieren\", \"pt\": \"Raramente reciclável, difícil de identificar\"}}," + "{\"codice\": \"08Lead\", \"materiale\": {\"it\": \"Piombo\", \"en\": \"Lead\", \"es\": \"Plomo\", \"fr\": \"Plomb\", \"de\": \"Blei\", \"pt\": \"Chumbo\"}, \"uso_comune\": {\"it\": \"Batterie per auto, pesi\", \"en\": \"Car batteries, weights\", \"es\": \"Baterías de coche, pesos\", \"fr\": \"Batteries de voiture, poids\", \"de\": \"Autobatterien, Gewichte\", \"pt\": \"Baterias de carro, pesos\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile, ma pericoloso\", \"en\": \"Recyclable, but hazardous\", \"es\": \"Reciclable, pero peligroso\", \"fr\": \"Recyclable, mais dangereux\", \"de\": \"Recycelbar, aber gefährlich\", \"pt\": \"Reciclável, mas perigoso\"}}," + "{\"codice\": \"09Alkaline\", \"materiale\": {\"it\": \"Alcaline\", \"en\": \"Alkaline\", \"es\": \"Alcalinas\", \"fr\": \"Alcalines\", \"de\": \"Alkaline\", \"pt\": \"Alcalinas\"}, \"uso_comune\": {\"it\": \"Batterie usa e getta\", \"en\": \"Disposable batteries\", \"es\": \"Pilas desechables\", \"fr\": \"Piles jetables\", \"de\": \"Einwegbatterien\", \"pt\": \"Pilhas descartáveis\"}, \"riciclabile\": true, \"note\": {\"it\": \"Non riciclabile, smaltire correttamente\", \"en\": \"Non-recyclable, dispose properly\", \"es\": \"No reciclable, desechar correctamente\", \"fr\": \"Non recyclable, éliminer correctement\", \"de\": \"Nicht recycelbar, ordnungsgemäß entsorgen\", \"pt\": \"Não reciclável, descarte corretamente\"}}," + "{\"codice\": \"11NiMh\", \"materiale\": {\"it\": \"Nichel-metallo idruro\", \"en\": \"Nickel-metal hydride\", \"es\": \"Níquel-metal hidruro\", \"fr\": \"Nickel-métal hydrure\", \"de\": \"Nickel-Metallhydrid\", \"pt\": \"Níquel-hidreto metálico\"}, \"uso_comune\": {\"it\": \"Batterie ricaricabili\", \"en\": \"Rechargeable batteries\", \"es\": \"Baterías recargables\", \"fr\": \"Batteries rechargeables\", \"de\": \"Wiederaufladbare Batterien\", \"pt\": \"Baterias recarregáveis\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile, ma richiede processi speciali\", \"en\": \"Recyclable, but requires special processes\", \"es\": \"Reciclable, pero requiere procesos especiales\", \"fr\": \"Recyclable, mais nécessite des processus spéciaux\", \"de\": \"Recycelbar, erfordert jedoch spezielle Prozesse\", \"pt\": \"Reciclável, mas requer processos especiais\"}}," + "{\"codice\": \"12Li\", \"materiale\": {\"it\": \"Litio\", \"en\": \"Lithium\", \"es\": \"Litio\", \"fr\": \"Lithium\", \"de\": \"Lithium\", \"pt\": \"Lítio\"}, \"uso_comune\": {\"it\": \"Batterie per dispositivi elettronici\", \"en\": \"Batteries for electronic devices\", \"es\": \"Baterías para dispositivos electrónicos\", \"fr\": \"Batteries pour appareils électroniques\", \"de\": \"Batterien für elektronische Geräte\", \"pt\": \"Baterias para dispositivos eletrônicos\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile, ma richiede processi speciali\", \"en\": \"Recyclable, but requires special processes\", \"es\": \"Reciclable, pero requiere procesos especiales\", \"fr\": \"Recyclable, mais nécessite des processus spéciaux\", \"de\": \"Recycelbar, erfordert jedoch spezielle Prozesse\", \"pt\": \"Reciclável, mas requer processos especiais\"}}," + "{\"codice\": \"13SO(Z)\", \"materiale\": {\"it\": \"Sodio-zinco\", \"en\": \"Sodium-zinc\", \"es\": \"Sodio-zinc\", \"fr\": \"Sodium-zinc\", \"de\": \"Natrium-Zink\", \"pt\": \"Sódio-zinco\"}, \"uso_comune\": {\"it\": \"Batterie per apparecchi acustici\", \"en\": \"Batteries for hearing aids\", \"es\": \"Baterías para audífonos\", \"fr\": \"Piles pour appareils auditifs\", \"de\": \"Batterien für Hörgeräte\", \"pt\": \"Baterias para aparelhos auditivos\"}, \"riciclabile\": true, \"note\": {\"it\": \"Non riciclabile, smaltire correttamente\", \"en\": \"Non-recyclable, dispose properly\", \"es\": \"No reciclable, desechar correctamente\", \"fr\": \"Non recyclable, éliminer correctement\", \"de\": \"Nicht recycelbar, ordnungsgemäß entsorgen\", \"pt\": \"Não reciclável, descarte corretamente\"}}," + "{\"codice\": \"20PAP\", \"materiale\": {\"it\": \"Carta e cartone ondulato\", \"en\": \"Corrugated paper and cardboard\", \"es\": \"Papel y cartón corrugado\", \"fr\": \"Papier et carton ondulé\", \"de\": \"Wellpappe und Karton\", \"pt\": \"Papel e cartão ondulado\"}, \"uso_comune\": {\"it\": \"Scatole di cartone\", \"en\": \"Cardboard boxes\", \"es\": \"Cajas de cartón\", \"fr\": \"Boîtes en carton\", \"de\": \"Kartonschachteln\", \"pt\": \"Caixas de papelão\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile ampiamente\", \"en\": \"Widely recyclable\", \"es\": \"Ampliamente reciclable\", \"fr\": \"Largement recyclable\", \"de\": \"Weitgehend recycelbar\", \"pt\": \"Amplamente reciclável\"}}," + "{\"codice\": \"21PAP\", \"materiale\": {\"it\": \"Carta e cartone non ondulato\", \"en\": \"Non-corrugated paper and cardboard\", \"es\": \"Papel y cartón no corrugado\", \"fr\": \"Papier et carton non ondulé\", \"de\": \"Nicht gewelltes Papier und Karton\", \"pt\": \"Papel e cartão não ondulado\"}, \"uso_comune\": {\"it\": \"Giornali, riviste, libri\", \"en\": \"Newspapers, magazines, books\", \"es\": \"Periódicos, revistas, libros\", \"fr\": \"Journaux, magazines, livres\", \"de\": \"Zeitungen, Zeitschriften, Bücher\", \"pt\": \"Jornais, revistas, livros\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile ampiamente\", \"en\": \"Widely recyclable\", \"es\": \"Ampliamente reciclable\", \"fr\": \"Largement recyclable\", \"de\": \"Weitgehend recycelbar\", \"pt\": \"Amplamente reciclável\"}}," + "{\"codice\": \"22PAP\", \"materiale\": {\"it\": \"Carta e cartone misti\", \"en\": \"Mixed paper and cardboard\", \"es\": \"Papel y cartón mixtos\", \"fr\": \"Papier et carton mélangés\", \"de\": \"Gemischtes Papier und Karton\", \"pt\": \"Papel e cartão misturados\"}, \"uso_comune\": {\"it\": \"Imballaggi misti\", \"en\": \"Mixed packaging\", \"es\": \"Embalajes mixtos\", \"fr\": \"Emballages mélangés\", \"de\": \"Gemischte Verpackungen\", \"pt\": \"Embalagens misturadas\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile, ma richiede selezione\", \"en\": \"Recyclable, but requires sorting\", \"es\": \"Reciclable, pero requiere selección\", \"fr\": \"Recyclable, mais nécessite un tri\", \"de\": \"Recycelbar, erfordert jedoch Sortierung\", \"pt\": \"Reciclável, mas requer triagem\"}}," + "{\"codice\": \"40FE\", \"materiale\": {\"it\": \"Acciaio\", \"en\": \"Steel\", \"es\": \"Acero\", \"fr\": \"Acier\", \"de\": \"Stahl\", \"pt\": \"Aço\"}, \"uso_comune\": {\"it\": \"Lattine, barattoli, scatolame\", \"en\": \"Cans, jars, tinplate\", \"es\": \"Latas, tarros, hojalata\", \"fr\": \"Boîtes de conserve, bocaux, fer blanc\", \"de\": \"Dosen, Gläser, Weißblech\", \"pt\": \"Latas, frascos, folha de flandres\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile ampiamente\", \"en\": \"Widely recyclable\", \"es\": \"Ampliamente reciclable\", \"fr\": \"Largement recyclable\", \"de\": \"Weitgehend recycelbar\", \"pt\": \"Amplamente reciclável\"}}," + "{\"codice\": \"41ALU\", \"materiale\": {\"it\": \"Alluminio\", \"en\": \"Aluminum\", \"es\": \"Aluminio\", \"fr\": \"Aluminium\", \"de\": \"Aluminium\", \"pt\": \"Alumínio\"}, \"uso_comune\": {\"it\": \"Lattine, fogli di alluminio, vaschette\", \"en\": \"Cans, aluminum foil, trays\", \"es\": \"Latas, papel de aluminio, bandejas\", \"fr\": \"Boîtes de conserve, papier d'aluminium, plateaux\", \"de\": \"Dosen, Aluminiumfolie, Schalen\", \"pt\": \"Latas, papel alumínio, bandejas\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile ampiamente\", \"en\": \"Widely recyclable\", \"es\": \"Ampliamente reciclable\", \"fr\": \"Largement recyclable\", \"de\": \"Weitgehend recycelbar\", \"pt\": \"Amplamente reciclável\"}}," + "{\"codice\": \"50FOR\", \"materiale\": {\"it\": \"Legno\", \"en\": \"Wood\", \"es\": \"Madera\", \"fr\": \"Bois\", \"de\": \"Holz\", \"pt\": \"Madeira\"}, \"uso_comune\": {\"it\": \"Mobili, pallet, cassette\", \"en\": \"Furniture, pallets, crates\", \"es\": \"Muebles, paletas, cajas\", \"fr\": \"Meubles, palettes, caisses\", \"de\": \"Möbel, Paletten, Kisten\", \"pt\": \"Móveis, paletes, caixas\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile, ma richiede trattamenti\", \"en\": \"Recyclable, but requires treatments\", \"es\": \"Reciclable, pero requiere tratamientos\", \"fr\": \"Recyclable, mais nécessite des traitements\", \"de\": \"Recycelbar, erfordert jedoch Behandlungen\", \"pt\": \"Reciclável, mas requer tratamentos\"}}," + "{\"codice\": \"51FOR\", \"materiale\": {\"it\": \"Sughero\", \"en\": \"Cork\", \"es\": \"Corcho\", \"fr\": \"Liège\", \"de\": \"Kork\", \"pt\": \"Cortiça\"}, \"uso_comune\": {\"it\": \"Tappi, isolanti\", \"en\": \"Caps, insulators\", \"es\": \"Tapones, aislantes\", \"fr\": \"Bouchons, isolants\", \"de\": \"Verschlüsse, Isolatoren\", \"pt\": \"Tampas, isolantes\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile, ma richiede processi speciali\", \"en\": \"Recyclable, but requires special processes\", \"es\": \"Reciclable, pero requiere procesos especiales\", \"fr\": \"Recyclable, mais nécessite des processus spéciaux\", \"de\": \"Recycelbar, erfordert jedoch spezielle Prozesse\", \"pt\": \"Reciclável, mas requer processos especiais\"}}," + "{\"codice\": \"60TEX\", \"materiale\": {\"it\": \"Cotone\", \"en\": \"Cotton\", \"es\": \"Algodón\", \"fr\": \"Coton\", \"de\": \"Baumwolle\", \"pt\": \"Algodão\"}, \"uso_comune\": {\"it\": \"Indumenti, tessuti\", \"en\": \"Clothing, textiles\", \"es\": \"Ropa, textiles\", \"fr\": \"Vêtements, textiles\", \"de\": \"Kleidung, Textilien\", \"pt\": \"Roupas, têxteis\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile, ma richiede processi speciali\", \"en\": \"Recyclable, but requires special processes\", \"es\": \"Reciclable, pero requiere procesos especiales\", \"fr\": \"Recyclable, mais nécessite des processus spéciaux\", \"de\": \"Recycelbar, erfordert jedoch spezielle Prozesse\", \"pt\": \"Reciclável, mas requer processos especiais\"}}," + "{\"codice\": \"61TEX\", \"materiale\": {\"it\": \"Fibre sintetiche\", \"en\": \"Synthetic fibers\", \"es\": \"Fibras sintéticas\", \"fr\": \"Fibres synthétiques\", \"de\": \"Synthetische Fasern\", \"pt\": \"Fibras sintéticas\"}, \"uso_comune\": {\"it\": \"Indumenti, tessuti\", \"en\": \"Clothing, textiles\", \"es\": \"Ropa, textiles\", \"fr\": \"Vêtements, textiles\", \"de\": \"Kleidung, Textilien\", \"pt\": \"Roupas, têxteis\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile raramente, difficile da riciclare\", \"en\": \"Rarely recyclable, difficult to recycle\", \"es\": \"Raramente reciclable, difícil de reciclar\", \"fr\": \"Rarement recyclable, difficile à recycler\", \"de\": \"Selten recycelbar, schwierig zu recyceln\", \"pt\": \"Raramente reciclável, difícil de reciclar\"}}," + "{\"codice\": \"70GL\", \"materiale\": {\"it\": \"Vetro incolore\", \"en\": \"Colorless glass\", \"es\": \"Vidrio incoloro\", \"fr\": \"Verre incolore\", \"de\": \"Farbloses Glas\", \"pt\": \"Vidro incolor\"}, \"uso_comune\": {\"it\": \"Bottiglie, vasetti\", \"en\": \"Bottles, jars\", \"es\": \"Botellas, tarros\", \"fr\": \"Bouteilles, bocaux\", \"de\": \"Flaschen, Gläser\", \"pt\": \"Garrafas, frascos\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile ampiamente\", \"en\": \"Widely recyclable\", \"es\": \"Ampliamente reciclable\", \"fr\": \"Largement recyclable\", \"de\": \"Weitgehend recycelbar\", \"pt\": \"Amplamente reciclável\"}}," + "{\"codice\": \"71GL\", \"materiale\": {\"it\": \"Vetro verde\", \"en\": \"Green glass\", \"es\": \"Vidrio verde\", \"fr\": \"Verre vert\", \"de\": \"Grünes Glas\", \"pt\": \"Vidro verde\"}, \"uso_comune\": {\"it\": \"Bottiglie\", \"en\": \"Bottles\", \"es\": \"Botellas\", \"fr\": \"Bouteilles\", \"de\": \"Flaschen\", \"pt\": \"Garrafas\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile ampiamente\", \"en\": \"Widely recyclable\", \"es\": \"Ampliamente reciclable\", \"fr\": \"Largement recyclable\", \"de\": \"Weitgehend recycelbar\", \"pt\": \"Amplamente reciclável\"}}," + "{\"codice\": \"72GL\", \"materiale\": {\"it\": \"Vetro marrone\", \"en\": \"Brown glass\", \"es\": \"Vidrio marrón\", \"fr\": \"Verre marron\", \"de\": \"Braunes Glas\", \"pt\": \"Vidro marrom\"}, \"uso_comune\": {\"it\": \"Bottiglie\", \"en\": \"Bottles\", \"es\": \"Botellas\", \"fr\": \"Bouteilles\", \"de\": \"Flaschen\", \"pt\": \"Garrafas\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile ampiamente\", \"en\": \"Widely recyclable\", \"es\": \"Ampliamente reciclable\", \"fr\": \"Largement recyclable\", \"de\": \"Weitgehend recycelbar\", \"pt\": \"Amplamente reciclável\"}}," + "{\"codice\": \"73GL\", \"materiale\": {\"it\": \"Cristallo\", \"en\": \"Crystal\", \"es\": \"Cristal\", \"fr\": \"Cristal\", \"de\": \"Kristall\", \"pt\": \"Cristal\"}, \"uso_comune\": {\"it\": \"Oggetti decorativi, bicchieri\", \"en\": \"Decorative objects, glasses\", \"es\": \"Objetos decorativos, vasos\", \"fr\": \"Objets décoratifs, verres\", \"de\": \"Dekorative Objekte, Gläser\", \"pt\": \"Objetos decorativos, copos\"}, \"riciclabile\": false, \"note\": {\"it\": \"Non riciclabile, contiene piombo\", \"en\": \"Non-recyclable, contains lead\", \"es\": \"No reciclable, contiene plomo\", \"fr\": \"Non recyclable, contient du plomb\", \"de\": \"Nicht recycelbar, enthält Blei\", \"pt\": \"Não reciclável, contém chumbo\"}}," + "{\"codice\": \"74GL\", \"materiale\": {\"it\": \"Vetroceramica\", \"en\": \"Glass-ceramic\", \"es\": \"Vitrocerámica\", \"fr\": \"Vitrocéramique\", \"de\": \"Glaskeramik\", \"pt\": \"Vitrocerâmica\"}, \"uso_comune\": {\"it\": \"Piani cottura, teglie\", \"en\": \"Cooktops, baking dishes\", \"es\": \"Placas de cocina, bandejas para hornear\", \"fr\": \"Plaques de cuisson, plats à four\", \"de\": \"Kochfelder, Backformen\", \"pt\": \"Placas de fogão, assadeiras\"}, \"riciclabile\": false, \"note\": {\"it\": \"Non riciclabile, composizione complessa\", \"en\": \"Non-recyclable, complex composition\", \"es\": \"No reciclable, composición compleja\", \"fr\": \"Non recyclable, composition complexe\", \"de\": \"Nicht recycelbar, komplexe Zusammensetzung\", \"pt\": \"Não reciclável, composição complexa\"}}," + "{\"codice\": \"75GL\", \"materiale\": {\"it\": \"Vetro borosilicato\", \"en\": \"Borosilicate glass\", \"es\": \"Vidrio de borosilicato\", \"fr\": \"Verre borosilicate\", \"de\": \"Borosilikatglas\", \"pt\": \"Vidro de borossilicato\"}, \"uso_comune\": {\"it\": \"Contenitori da laboratorio, utensili da cucina\", \"en\": \"Laboratory containers, kitchenware\", \"es\": \"Recipientes de laboratorio, utensilios de cocina\", \"fr\": \"Contenants de laboratoire, ustensiles de cuisine\", \"de\": \"Laborbehälter, Küchenutensilien\", \"pt\": \"Recipientes de laboratório, utensílios de cozinha\"}, \"riciclabile\": false, \"note\": {\"it\": \"Non riciclabile, punto di fusione elevato\", \"en\": \"Non-recyclable, high melting point\", \"es\": \"No reciclable, punto de fusión alto\", \"fr\": \"Non recyclable, point de fusion élevé\", \"de\": \"Nicht recycelbar, hoher Schmelzpunkt\", \"pt\": \"Não reciclável, ponto de fusão alto\"}}," + "{\"codice\": \"76GL\", \"materiale\": {\"it\": \"Lana di vetro\", \"en\": \"Glass wool\", \"es\": \"Lana de vidrio\", \"fr\": \"Laine de verre\", \"de\": \"Glaswolle\", \"pt\": \"Lã de vidro\"}, \"uso_comune\": {\"it\": \"Isolanti\", \"en\": \"Insulators\", \"es\": \"Aislantes\", \"fr\": \"Isolants\", \"de\": \"Isolatoren\", \"pt\": \"Isolantes\"}, \"riciclabile\": false, \"note\": {\"it\": \"Non riciclabile, fibre pericolose\", \"en\": \"Non-recyclable, hazardous fibers\", \"es\": \"No reciclable, fibras peligrosas\", \"fr\": \"Non recyclable, fibres dangereuses\", \"de\": \"Nicht recycelbar, gefährliche Fasern\", \"pt\": \"Não reciclável, fibras perigosas\"}}," + "{\"codice\": \"77GL\", \"materiale\": {\"it\": \"Vetro al quarzo\", \"en\": \"Quartz glass\", \"es\": \"Vidrio de cuarzo\", \"fr\": \"Verre de quartz\", \"de\": \"Quarzglas\", \"pt\": \"Vidro de quartzo\"}, \"uso_comune\": {\"it\": \"Lampade UV, strumenti scientifici\", \"en\": \"UV lamps, scientific instruments\", \"es\": \"Lámparas UV, instrumentos científicos\", \"fr\": \"Lampes UV, instruments scientifiques\", \"de\": \"UV-Lampen, wissenschaftliche Instrumente\", \"pt\": \"Lâmpadas UV, instrumentos científicos\"}, \"riciclabile\": false, \"note\": {\"it\": \"Non riciclabile, punto di fusione elevato\", \"en\": \"Non-recyclable, high melting point\", \"es\": \"No reciclable, punto de fusión alto\", \"fr\": \"Non recyclable, point de fusion élevé\", \"de\": \"Nicht recycelbar, hoher Schmelzpunkt\", \"pt\": \"Não reciclável, ponto de fusão alto\"}}," + "{\"codice\": \"78GL\", \"materiale\": {\"it\": \"Vetro sodico-calcico\", \"en\": \"Soda-lime glass\", \"es\": \"Vidrio de cal sodada\", \"fr\": \"Verre sodocalcique\", \"de\": \"Kalk-Natron-Glas\", \"pt\": \"Vidro de cal sodada\"}, \"uso_comune\": {\"it\": \"Finestre, bottiglie\", \"en\": \"Windows, bottles\", \"es\": \"Ventanas, botellas\", \"fr\": \"Fenêtres, bouteilles\", \"de\": \"Fenster, Flaschen\", \"pt\": \"Janelas, garrafas\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile ampiamente\", \"en\": \"Widely recyclable\", \"es\": \"Ampliamente reciclable\", \"fr\": \"Largement recyclable\", \"de\": \"Weitgehend recycelbar\", \"pt\": \"Amplamente reciclável\"}}," + "{\"codice\": \"79GL\", \"materiale\": {\"it\": \"Vetro speciale\", \"en\": \"Special glass\", \"es\": \"Vidrio especial\", \"fr\": \"Verre spécial\", \"de\": \"Spezialglas\", \"pt\": \"Vidro especial\"}, \"uso_comune\": {\"it\": \"Lenti ottiche, vetri di sicurezza\", \"en\": \"Optical lenses, safety glass\", \"es\": \"Lentes ópticas, vidrio de seguridad\", \"fr\": \"Lentilles optiques, verres de sécurité\", \"de\": \"Optische Linsen, Sicherheitsglas\", \"pt\": \"Lentes ópticas, vidro de segurança\"}, \"riciclabile\": false, \"note\": {\"it\": \"Non riciclabile, composizione varia\", \"en\": \"Non-recyclable, various compositions\", \"es\": \"No reciclable, composiciones variadas\", \"fr\": \"Non recyclable, compositions variées\", \"de\": \"Nicht recycelbar, verschiedene Zusammensetzungen\", \"pt\": \"Não reciclável, composições variadas\"}}," + "{\"codice\": \"80PAP\", \"materiale\": {\"it\": \"Carta e cartone misti\", \"en\": \"Mixed paper and cardboard\", \"es\": \"Papel y cartón mixtos\", \"fr\": \"Papier et carton mélangés\", \"de\": \"Gemischtes Papier und Karton\", \"pt\": \"Papel e cartão misturados\"}, \"uso_comune\": {\"it\": \"Imballaggi misti\", \"en\": \"Mixed packaging\", \"es\": \"Embalajes mixtos\", \"fr\": \"Emballages mélangés\", \"de\": \"Gemischte Verpackungen\", \"pt\": \"Embalagens misturadas\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile, ma richiede selezione\", \"en\": \"Recyclable, but requires sorting\", \"es\": \"Reciclable, pero requiere selección\", \"fr\": \"Recyclable, mais nécessite un tri\", \"de\": \"Recycelbar, erfordert jedoch Sortierung\", \"pt\": \"Reciclável, mas requer triagem\"}}," + "{\"codice\": \"84C/PAP\", \"materiale\": {\"it\": \"Carta/Cartone e Plastica/Alluminio\", \"en\": \"Paper/Cardboard and Plastic/Aluminum\", \"es\": \"Papel/Cartón y Plástico/Aluminio\", \"fr\": \"Papier/Carton et Plastique/Aluminium\", \"de\": \"Papier/Karton und Kunststoff/Aluminium\", \"pt\": \"Papel/Cartão e Plástico/Alumínio\"}, \"uso_comune\": {\"it\": \"Tetra Pak\", \"en\": \"Tetra Pak\", \"es\": \"Tetra Pak\", \"fr\": \"Tetra Pak\", \"de\": \"Tetra Pak\", \"pt\": \"Tetra Pak\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile in alcune aree\", \"en\": \"Recyclable in some areas\", \"es\": \"Reciclable en algunas áreas\", \"fr\": \"Recyclable dans certaines zones\", \"de\": \"In einigen Gebieten recycelbar\", \"pt\": \"Reciclável em algumas áreas\"}}," + "{\"codice\": \"87CSL\", \"materiale\": {\"it\": \"Materiali compostabili\", \"en\": \"Compostable materials\", \"es\": \"Materiales compostables\", \"fr\": \"Matériaux compostables\", \"de\": \"Kompostierbare Materialien\", \"pt\": \"Materiais compostáveis\"}, \"uso_comune\": {\"it\": \"Bioplastiche, imballaggi compostabili\", \"en\": \"Bioplastics, compostable packaging\", \"es\": \"Bioplásticos, embalajes compostables\", \"fr\": \"Bioplastiques, emballages compostables\", \"de\": \"Biokunststoffe, kompostierbare Verpackungen\", \"pt\": \"Bioplásticos, embalagens compostáveis\"}, \"riciclabile\": true, \"note\": {\"it\": \"Riciclabile tramite compostaggio industriale\", \"en\": \"Recyclable through industrial composting\", \"es\": \"Reciclable mediante compostaje industrial\", \"fr\": \"Recyclable par compostage industriel\", \"de\": \"Recycelbar durch industrielle Kompostierung\", \"pt\": \"Reciclável por compostagem industrial\"}}," + "{\"codice\": \"90C/LDPE\", \"materiale\": {\"it\": \"Plastica/Alluminio\", \"en\": \"Plastic/Aluminum\", \"es\": \"Plástico/Aluminio\", \"fr\": \"Plastique/Aluminium\", \"de\": \"Kunststoff/Aluminium\", \"pt\": \"Plástico/Alumínio\"}, \"uso_comune\": {\"it\": \"Sacchetti di caffè\", \"en\": \"Coffee bags\", \"es\": \"Bolsas de café\", \"fr\": \"Sacs de café\", \"de\": \"Kaffeebeutel\", \"pt\": \"Sacos de café\"}, \"riciclabile\": false, \"note\": {\"it\": \"Difficilmente riciclabile\", \"en\": \"Difficult to recycle\", \"es\": \"Difícil de reciclar\", \"fr\": \"Difficile à recycler\", \"de\": \"Schwer zu recyceln\", \"pt\": \"Difícil de reciclar\"}}," + "{\"codice\": \"91C/LDPE\", \"materiale\": {\"it\": \"Plastica/Alluminio\", \"en\": \"Plastic/Aluminum\", \"es\": \"Plástico/Aluminio\", \"fr\": \"Plastique/Aluminium\", \"de\": \"Kunststoff/Aluminium\", \"pt\": \"Plástico/Alumínio\"}, \"uso_comune\": {\"it\": \"Sacchetti di caffè\", \"en\": \"Coffee bags\", \"es\": \"Bolsas de café\", \"fr\": \"Sacs de café\", \"de\": \"Kaffeebeutel\", \"pt\": \"Sacos de café\"}, \"riciclabile\": false, \"note\": {\"it\": \"Difficilmente riciclabile\", \"en\": \"Difficult to recycle\", \"es\": \"Difícil de reciclar\", \"fr\": \"Difficile à recycler\", \"de\": \"Schwer zu recyceln\", \"pt\": \"Difícil de reciclar\"}}," + "{\"codice\": \"92C/FE\", \"materiale\": {\"it\": \"Plastica/Acciaio\", \"en\": \"Plastic/Steel\", \"es\": \"Plástico/Acero\", \"fr\": \"Plastique/Acier\", \"de\": \"Kunststoff/Stahl\", \"pt\": \"Plástico/Aço\"}, \"uso_comune\": {\"it\": \"Imballaggi misti\", \"en\": \"Mixed packaging\", \"es\": \"Embalajes mixtos\", \"fr\": \"Emballages mixtes\", \"de\": \"Mischverpackungen\", \"pt\": \"Embalagens mistas\"}, \"riciclabile\": false, \"note\": {\"it\": \"Difficilmente riciclabile\", \"en\": \"Difficult to recycle\", \"es\": \"Difícil de reciclar\", \"fr\": \"Difficile à recycler\", \"de\": \"Schwer zu recyceln\", \"pt\": \"Difícil de reciclar\"}}," + "{\"codice\": \"ABS\", \"materiale\": {\"it\": \"Acrilonitrile butadiene stirene\", \"en\": \"Acrylonitrile butadiene styrene\", \"es\": \"Acrilonitrilo butadieno estireno\", \"fr\": \"Acrylonitrile butadiène styrène\", \"de\": \"Acrylnitril-Butadien-Styrol\", \"pt\": \"Acrilonitrilo butadieno estireno\"}, \"uso_comune\": {\"it\": \"Giocattoli, elettrodomestici, parti di auto\", \"en\": \"Toys, appliances, car parts\", \"es\": \"Juguetes, electrodomésticos, piezas de automóviles\", \"fr\": \"Jouets, appareils électroménagers, pièces automobiles\", \"de\": \"Spielzeug, Haushaltsgeräte, Autoteile\", \"pt\": \"Brinquedos, eletrodomésticos, peças de automóveis\"}, \"riciclabile\": false, \"note\": {\"it\": \"Difficilmente riciclabile\", \"en\": \"Difficult to recycle\", \"es\": \"Difícil de reciclar\", \"fr\": \"Difficile à recycler\", \"de\": \"Schwer zu recyceln\", \"pt\": \"Difícil de reciclar\"}}," + "{\"codice\": \"PA\", \"materiale\": {\"it\": \"Poliammide (Nylon)\", \"en\": \"Polyamide (Nylon)\", \"es\": \"Poliamida (Nylon)\", \"fr\": \"Polyamide (Nylon)\", \"de\": \"Polyamid (Nylon)\", \"pt\": \"Poliamida (Nylon)\"}, \"uso_comune\": {\"it\": \"Tessuti, corde, parti di auto\", \"en\": \"Fabrics, ropes, car parts\", \"es\": \"Tejidos, cuerdas, piezas de automóviles\", \"fr\": \"Tissus, cordes, pièces automobiles\", \"de\": \"Stoffe, Seile, Autoteile\", \"pt\": \"Tecidos, cordas, peças de automóveis\"}, \"riciclabile\": false, \"note\": {\"it\": \"Difficilmente riciclabile\", \"en\": \"Difficult to recycle\", \"es\": \"Difícil de reciclar\", \"fr\": \"Difficile à recycler\", \"de\": \"Schwer zu recyceln\", \"pt\": \"Difícil de reciclar\"}}" + "]"; public RecycleAI(ComponentContainer container) { super(container.$form()); activity = container.$context(); } @SimpleProperty(description = "Set up your OpenAI API Key") public void SetApiKey(String key) { this.apiKey = key; } @SimpleFunction(description = "Extracts Recycling Codes and Materials from sentence") public void GetRecyclingInfo(final String sentence) { AsynchUtil.runAsynchronously( new Runnable() { @Override public void run() { try { final String prompt = "Rispondi solo con un JSON contenente la chiave 'codici'. " + "il formato di 'codici' deve essere ASSOLUTAMENTE in questo formato \"codici\":[\"xx\", \"yy\", \"zz\"]" + "Se trovi codici alfabetici, sostituiscili con il numero corrispondente secondo la lista, inserisci i codici doppi una sola volta: " + "PETE → \"01\", PET → \"01\", HDPE → \"02\", PEHD → \"02\", PVC → \"03\", PELD → \"04\", LDPE → \"04\", PP → \"05\", PS → \"06\", O → \"07\", OTHER → \"07\", " + "PETE1 → \"01\", PET1 → \"01\", HDPE2 → \"02\", PEHD2 → \"02\", PVC3 → \"03\", PELD4 → \"04\", LDPE4 → \"04\", PP5 → \"05\", PS6 → \"06\", O7 → \"07\", OTHER7 → \"07\", " + "Lead → \"08\", Alkaline → \"09\", NiMH → \"11\", Li → \"12\", SO(Z) → \"13\", " + "PAP → \"20\", FE → \"40\", ALU → \"41\", FOR → \"50\", COT → \"60\", TEX → \"61\", GL → \"70\"," + "GL70 → \"70\", GL71 → \"71\", GL72 → \"72\", GL73 → \"73\", GL74 → \"74\", GL75 → \"75\", GL76 → \"76\", GL77 → \"77\", GL78 → \"78\", GL79 → \"79\"," + "PAP20 → \"20\", PAP21 → \"21\", PAP22 → \"22\", " + "C/ALU → \"41\", C/PAP → \"84\", CLS → \"87\", C/LDPE → \"90\", C/FE → \"92\", ABS → \"ABS\", PA → \"PA\"." + //"Se trovi codici non presenti nella lista 01-14, 20-22, 40-41, 50-51, 60-61, 70-79, 80, 84, 87, 90, 91, ignorali." + "Frase: " + sentence; sendRequest(prompt, true); } catch (Exception e) { e.printStackTrace(); } } }); } @SimpleFunction(description = "Ottiene informazioni su un materiale o codice di riciclaggio.") public void GetMaterialInfo(final String sentence, final String language) { AsynchUtil.runAsynchronously( new Runnable() { @Override public void run() { try { GetInfo(sentence,language); } catch (Exception e) { e.printStackTrace(); } } }); } @SimpleEvent(description = "Evento che restituisce i dati estratti sui codici e materiali") public void GotRecyclingInfo(int responseCode, String response, String errorMessage, YailList recyclingCodes, YailList materials) { EventDispatcher.dispatchEvent(this, "GotRecyclingInfo", responseCode, response, errorMessage, recyclingCodes, materials); } @SimpleEvent(description = "Restituisce le informazioni generali sul materiale o codice.") public void GotMaterialInfo(String material, String commonUse, String recyclable, String note) { EventDispatcher.dispatchEvent(this, "GotMaterialInfo", material, commonUse, recyclable, note); } private void GetInfo(final String phrase, final String language) { String code = phrase.replaceAll("[^0-9a-zA-Z\\s\\(\\)]", "").trim().toUpperCase(); try { JSONArray jsonArray = new JSONArray(RECYCLING_DATA); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); if (jsonObject.getString("codice").replaceAll("[^0-9a-zA-Z\\s\\(\\)]", "").trim().toUpperCase().equals(code)) { JSONObject materialObj = jsonObject.getJSONObject("materiale"); JSONObject usoComuneObj = jsonObject.getJSONObject("uso_comune"); final boolean riciclabile = jsonObject.getBoolean("riciclabile"); JSONObject noteObj = jsonObject.getJSONObject("note"); final String materiale = materialObj.getString(language); final String usoComune = usoComuneObj.getString(language); final String note = noteObj.getString(language); activity.runOnUiThread(new Runnable() { @Override public void run() { GotMaterialInfo(materiale, usoComune, String.valueOf(riciclabile), note); } }); return; // Esci dalla funzione dopo aver trovato il codice } } // Se non viene trovato il codice, invia una richiesta a ChatGPT final String prompt = "Fornisci informazioni generali sul materiale o codice di riciclaggio: " + phrase + ". Fornisci le informazioni in lingua " + language; sendRequest(prompt, false); } catch (final Exception e) { e.printStackTrace(); // Gestisci l'errore, ad esempio inviando un messaggio di errore activity.runOnUiThread(new Runnable() { @Override public void run() { GotMaterialInfo("Errore durante l'elaborazione dei dati locali: " + e.getMessage(), "", "", ""); } }); } } private void sendRequest(final String prompt, final boolean isRecyclingRequest) { StringBuilder response = new StringBuilder(); String codiciString = ""; try { URL url = new URL(API_URL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Authorization", "Bearer " + apiKey); conn.setRequestProperty("Content-Type", "application/json"); conn.setDoOutput(true); JSONObject requestBody = new JSONObject(); requestBody.put("model", "gpt-4-turbo"); requestBody.put("messages", new JSONArray().put(new JSONObject().put("role", "user").put("content", prompt))); requestBody.put("temperature", 0.3); OutputStream os = conn.getOutputStream(); os.write(requestBody.toString().getBytes()); os.flush(); os.close(); final int responseCode = conn.getResponseCode(); BufferedReader in = new BufferedReader(new InputStreamReader(responseCode >= 200 && responseCode < 300 ? conn.getInputStream() : conn.getErrorStream())); String inputLine; while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); conn.disconnect(); JSONObject jsonResponse = new JSONObject(response.toString()); String responseText = jsonResponse.getJSONArray("choices").getJSONObject(0).getJSONObject("message").getString("content"); // Pulizia della stringa ricevuta String cleanedResponse = responseText.trim(); // Rimuoviamo virgolette iniziali/finali se presenti if (cleanedResponse.startsWith("\"") && cleanedResponse.endsWith("\"")) { cleanedResponse = cleanedResponse.substring(1, cleanedResponse.length() - 1); } // Correggiamo eventuali caratteri escape cleanedResponse = cleanedResponse.replace("\\\"", "\""); if (isRecyclingRequest) { try { int startCodici = cleanedResponse.indexOf("\"codici\":"); if (startCodici == -1) { throw new Exception("Chiave 'codici' non trovata nel JSON."); } codiciString = "{\"codici\":" + cleanedResponse.substring(startCodici + 9) + "}"; JSONObject codiceJson = new JSONObject(codiciString); // Nuovo codice per gestire un solo elemento senza [] Object codiciObject = codiceJson.get("codici"); JSONArray codesArray; if (codiciObject instanceof JSONArray) { codesArray = (JSONArray) codiciObject; } else if (codiciObject instanceof String) { codesArray = new JSONArray(); codesArray.put((String) codiciObject); // Trasforma la stringa in un array con un solo elemento } else { throw new Exception("Formato JSON non valido per 'codici'"); } List codesList = new ArrayList<>(); List materialsList = new ArrayList<>(); for (int i = 0; i < codesArray.length(); i++) { String code = codesArray.getString(i); String formattedCode = code.length() == 1 ? "0" + code : code; if (RECYCLING_CODE_MAP.containsKey(code)) { String[] data = RECYCLING_CODE_MAP.get(code); codesList.add(code + data[0]); materialsList.add(data[1]); } } final YailList recyclingCodes = YailList.makeList(codesList); final YailList materials = YailList.makeList(materialsList); final String responseTextfin = responseText; activity.runOnUiThread(new Runnable() { @Override public void run() { GotRecyclingInfo(responseCode, responseTextfin, "", recyclingCodes, materials); } }); } catch (Exception e) { final String responseTextfin = responseText; final String error = e.getMessage(); activity.runOnUiThread(new Runnable() { @Override public void run() { GotRecyclingInfo(responseCode, responseTextfin, "Error parsing JSON: " + error, YailList.makeEmptyList(), YailList.makeEmptyList()); } }); } } else { final String responseTextfin = responseText; activity.runOnUiThread(new Runnable() { @Override public void run() { GotMaterialInfo("", responseTextfin, "",""); } }); } } catch (Exception e) { final String error = e.getMessage(); activity.runOnUiThread(new Runnable() { @Override public void run() { GotRecyclingInfo(500, "", error, YailList.makeEmptyList(), YailList.makeEmptyList()); } }); } } }