fix setup process
This commit is contained in:
@@ -4,404 +4,404 @@
|
|||||||
"channel": 1,
|
"channel": 1,
|
||||||
"name": "Sconosciuto",
|
"name": "Sconosciuto",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": 0.65,
|
"level_db": 0.0,
|
||||||
"pan": 0
|
"pan": 65
|
||||||
},
|
},
|
||||||
"2": {
|
"2": {
|
||||||
"channel": 2,
|
"channel": 2,
|
||||||
"name": "Gelato",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": 0.0,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -225
|
||||||
},
|
},
|
||||||
"3": {
|
"3": {
|
||||||
"channel": 3,
|
"channel": 3,
|
||||||
"name": "Talkback",
|
"name": "Sconosciuto",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.0,
|
||||||
"pan": 0
|
"pan": -9400
|
||||||
},
|
},
|
||||||
"4": {
|
"4": {
|
||||||
"channel": 4,
|
"channel": 4,
|
||||||
"name": "Sconosciuto",
|
"name": "Sconosciuto",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.0,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"5": {
|
"5": {
|
||||||
"channel": 5,
|
"channel": 5,
|
||||||
"name": "Vox1",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -1.1,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -270
|
||||||
},
|
},
|
||||||
"6": {
|
"6": {
|
||||||
"channel": 6,
|
"channel": 6,
|
||||||
"name": "Vox2",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -0.15,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -345
|
||||||
},
|
},
|
||||||
"7": {
|
"7": {
|
||||||
"channel": 7,
|
"channel": 7,
|
||||||
"name": "Basso",
|
"name": "Sconosciuto",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": 5.0,
|
"level_db": 0.0,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"8": {
|
"8": {
|
||||||
"channel": 8,
|
"channel": 8,
|
||||||
"name": "Sconosciuto",
|
"name": "Sconosciuto",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.0,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"9": {
|
"9": {
|
||||||
"channel": 9,
|
"channel": 9,
|
||||||
"name": "Kick",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -0.35,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -35
|
||||||
},
|
},
|
||||||
"10": {
|
"10": {
|
||||||
"channel": 10,
|
"channel": 10,
|
||||||
"name": "Snare",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -5.25,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -525
|
||||||
},
|
},
|
||||||
"11": {
|
"11": {
|
||||||
"channel": 11,
|
"channel": 11,
|
||||||
"name": "Tom 1",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -12.1,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -1210
|
||||||
},
|
},
|
||||||
"12": {
|
"12": {
|
||||||
"channel": 12,
|
"channel": 12,
|
||||||
"name": "Tom 2",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -14.9,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -1490
|
||||||
},
|
},
|
||||||
"13": {
|
"13": {
|
||||||
"channel": 13,
|
"channel": 13,
|
||||||
"name": "Tom3",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -24.0,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -2400
|
||||||
},
|
},
|
||||||
"14": {
|
"14": {
|
||||||
"channel": 14,
|
"channel": 14,
|
||||||
"name": "Pan SX",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -114.0,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -11400
|
||||||
},
|
},
|
||||||
"15": {
|
"15": {
|
||||||
"channel": 15,
|
"channel": 15,
|
||||||
"name": "Pan dx",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -96.0,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -9600
|
||||||
},
|
},
|
||||||
"16": {
|
"16": {
|
||||||
"channel": 16,
|
"channel": 16,
|
||||||
"name": "Sconosciuto",
|
"name": "Sconosciuto",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.0,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"17": {
|
"17": {
|
||||||
"channel": 17,
|
"channel": 17,
|
||||||
"name": "Sconosciuto",
|
"name": "Sconosciuto",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.0,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"18": {
|
"18": {
|
||||||
"channel": 18,
|
"channel": 18,
|
||||||
"name": "Archetto",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"19": {
|
"19": {
|
||||||
"channel": 19,
|
"channel": 19,
|
||||||
"name": "Vox 5",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -0.1,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -10
|
||||||
},
|
},
|
||||||
"20": {
|
"20": {
|
||||||
"channel": 20,
|
"channel": 20,
|
||||||
"name": "Tast",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -0.9,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -90
|
||||||
},
|
},
|
||||||
"21": {
|
"21": {
|
||||||
"channel": 21,
|
"channel": 21,
|
||||||
"name": "Sconosciuto",
|
"name": "Sconosciuto",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.0,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"22": {
|
"22": {
|
||||||
"channel": 22,
|
"channel": 22,
|
||||||
"name": "Sconosciuto",
|
"name": "Sconosciuto",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.0,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"23": {
|
"23": {
|
||||||
"channel": 23,
|
"channel": 23,
|
||||||
"name": " Vox3",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": 1.3,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -265
|
||||||
},
|
},
|
||||||
"24": {
|
"24": {
|
||||||
"channel": 24,
|
"channel": 24,
|
||||||
"name": "Chit cnt",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -1.75,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -65
|
||||||
},
|
},
|
||||||
"25": {
|
"25": {
|
||||||
"channel": 25,
|
"channel": 25,
|
||||||
"name": "Chit dx",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -114.0,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -9400
|
||||||
},
|
},
|
||||||
"26": {
|
"26": {
|
||||||
"channel": 26,
|
"channel": 26,
|
||||||
"name": "Sconosciuto",
|
"name": "Sconosciuto",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.0,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"27": {
|
"27": {
|
||||||
"channel": 27,
|
"channel": 27,
|
||||||
"name": "Vox 4",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -11400
|
||||||
},
|
},
|
||||||
"28": {
|
"28": {
|
||||||
"channel": 28,
|
"channel": 28,
|
||||||
"name": "Sconosciuto",
|
"name": "Sconosciuto",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.0,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"29": {
|
"29": {
|
||||||
"channel": 29,
|
"channel": 29,
|
||||||
"name": "Pad",
|
"name": "Sconosciuto",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": -59.2,
|
"level_db": 0.0,
|
||||||
"pan": 0
|
"pan": -5920
|
||||||
},
|
},
|
||||||
"30": {
|
"30": {
|
||||||
"channel": 30,
|
"channel": 30,
|
||||||
"name": "Sconosciuto",
|
"name": "Sconosciuto",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.0,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"31": {
|
"31": {
|
||||||
"channel": 31,
|
"channel": 31,
|
||||||
"name": "Sconosciuto",
|
"name": "Sconosciuto",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.0,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"32": {
|
"32": {
|
||||||
"channel": 32,
|
"channel": 32,
|
||||||
"name": "Sconosciuto",
|
"name": "Sconosciuto",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.0,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"33": {
|
"33": {
|
||||||
"channel": 33,
|
"channel": 33,
|
||||||
"name": "PC",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -20.4,
|
"level_db": 0.01,
|
||||||
"pan": -63
|
"pan": -2040
|
||||||
},
|
},
|
||||||
"34": {
|
"34": {
|
||||||
"channel": 34,
|
"channel": 34,
|
||||||
"name": "PC",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -20.4,
|
"level_db": 0.01,
|
||||||
"pan": 63
|
"pan": -2040
|
||||||
},
|
},
|
||||||
"35": {
|
"35": {
|
||||||
"channel": 35,
|
"channel": 35,
|
||||||
"name": "ch35",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"36": {
|
"36": {
|
||||||
"channel": 36,
|
"channel": 36,
|
||||||
"name": "ch36",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"37": {
|
"37": {
|
||||||
"channel": 37,
|
"channel": 37,
|
||||||
"name": "ch37",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"38": {
|
"38": {
|
||||||
"channel": 38,
|
"channel": 38,
|
||||||
"name": "ch38",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"39": {
|
"39": {
|
||||||
"channel": 39,
|
"channel": 39,
|
||||||
"name": "ch39",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
},
|
},
|
||||||
"40": {
|
"40": {
|
||||||
"channel": 40,
|
"channel": 40,
|
||||||
"name": "ch40",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": null,
|
"level_db": 0.01,
|
||||||
"pan": 0
|
"pan": -32768
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mixes": {
|
"mixes": {
|
||||||
"1": {
|
"1": {
|
||||||
"mix": 1,
|
"mix": 1,
|
||||||
"name": "Aux 1",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -1.55
|
"level_db": 0.01
|
||||||
},
|
},
|
||||||
"2": {
|
"2": {
|
||||||
"mix": 2,
|
"mix": 2,
|
||||||
"name": "Aux 2",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": 8.1
|
"level_db": 0.01
|
||||||
},
|
},
|
||||||
"3": {
|
"3": {
|
||||||
"mix": 3,
|
"mix": 3,
|
||||||
"name": "Aux 3",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -9.1
|
"level_db": 0.01
|
||||||
},
|
},
|
||||||
"4": {
|
"4": {
|
||||||
"mix": 4,
|
"mix": 4,
|
||||||
"name": "Aux 4",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -0.6
|
"level_db": 0.01
|
||||||
},
|
},
|
||||||
"5": {
|
"5": {
|
||||||
"mix": 5,
|
"mix": 5,
|
||||||
"name": "batteria",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": 1.35
|
"level_db": 0.01
|
||||||
},
|
},
|
||||||
"6": {
|
"6": {
|
||||||
"mix": 6,
|
"mix": 6,
|
||||||
"name": "Aux 6",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -6.65
|
"level_db": 0.01
|
||||||
},
|
},
|
||||||
"7": {
|
"7": {
|
||||||
"mix": 7,
|
"mix": 7,
|
||||||
"name": "Aux 7",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -2.7
|
"level_db": 0.01
|
||||||
},
|
},
|
||||||
"8": {
|
"8": {
|
||||||
"mix": 8,
|
"mix": 8,
|
||||||
"name": "Aux 8",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -5.05
|
"level_db": 0.01
|
||||||
},
|
},
|
||||||
"9": {
|
"9": {
|
||||||
"mix": 9,
|
"mix": 9,
|
||||||
"name": "Aux 9/10",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -8.1
|
"level_db": 0.01
|
||||||
},
|
},
|
||||||
"10": {
|
"10": {
|
||||||
"mix": 10,
|
"mix": 10,
|
||||||
"name": "Aux 9/10",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -8.1
|
"level_db": 0.01
|
||||||
},
|
},
|
||||||
"11": {
|
"11": {
|
||||||
"mix": 11,
|
"mix": 11,
|
||||||
"name": "Aux Pulp",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -10.3
|
"level_db": 0.01
|
||||||
},
|
},
|
||||||
"12": {
|
"12": {
|
||||||
"mix": 12,
|
"mix": 12,
|
||||||
"name": "Aux Pulp",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": -10.3
|
"level_db": 0.01
|
||||||
},
|
},
|
||||||
"13": {
|
"13": {
|
||||||
"mix": 13,
|
"mix": 13,
|
||||||
"name": "Aux13/14",
|
"name": "Sconosciuto",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": -1.6
|
"level_db": 0.0
|
||||||
},
|
},
|
||||||
"14": {
|
"14": {
|
||||||
"mix": 14,
|
"mix": 14,
|
||||||
"name": "Aux13/14",
|
"name": "Sconosciuto",
|
||||||
"on": false,
|
"on": false,
|
||||||
"level_db": -1.6
|
"level_db": 0.0
|
||||||
},
|
},
|
||||||
"15": {
|
"15": {
|
||||||
"mix": 15,
|
"mix": 15,
|
||||||
"name": "Aux15/16",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": 0.1
|
"level_db": 0.01
|
||||||
},
|
},
|
||||||
"16": {
|
"16": {
|
||||||
"mix": 16,
|
"mix": 16,
|
||||||
"name": "Aux15/16",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": 0.1
|
"level_db": 0.01
|
||||||
},
|
},
|
||||||
"17": {
|
"17": {
|
||||||
"mix": 17,
|
"mix": 17,
|
||||||
"name": "Diretta",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": 0.0
|
"level_db": 0.01
|
||||||
},
|
},
|
||||||
"18": {
|
"18": {
|
||||||
"mix": 18,
|
"mix": 18,
|
||||||
"name": "Diretta",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": 0.0
|
"level_db": 0.01
|
||||||
},
|
},
|
||||||
"19": {
|
"19": {
|
||||||
"mix": 19,
|
"mix": 19,
|
||||||
"name": "Traduzio",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": 6.0
|
"level_db": 0.01
|
||||||
},
|
},
|
||||||
"20": {
|
"20": {
|
||||||
"mix": 20,
|
"mix": 20,
|
||||||
"name": "Traduzio",
|
"name": "Sconosciuto",
|
||||||
"on": true,
|
"on": false,
|
||||||
"level_db": 6.0
|
"level_db": 0.01
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"timestamp": 1762196878.5570433
|
"timestamp": 1762198236.5701377
|
||||||
}
|
}
|
||||||
@@ -1,33 +1,21 @@
|
|||||||
{
|
{
|
||||||
"user_id": 1073121360,
|
"user_id": 1073121360,
|
||||||
"username": "Ingdavidfeliz",
|
"username": "Ingdavidfeliz",
|
||||||
"last_updated": 1762197074.7985318,
|
"last_updated": 1762197549.52935,
|
||||||
"last_updated_str": "2025-11-03 20:11:14",
|
"last_updated_str": "2025-11-03 19:19:09",
|
||||||
"message_count": 4,
|
"message_count": 2,
|
||||||
"history": [
|
"history": [
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Alzi canale 7.",
|
"content": "Alzami il basso",
|
||||||
"timestamp": 1762197058.7480035,
|
"timestamp": 1762197547.3495104,
|
||||||
"timestamp_str": "2025-11-03 20:10:58"
|
"timestamp_str": "2025-11-03 19:19:07"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": "Certo, alzo il canale 7. Di quanto lo vuoi alzare?",
|
"content": "Ciao David! Per \"alzami il basso\", intendi nel tuo monitor personale o in un altro mix? Ho bisogno di sapere in quale mix vuoi che alzi il basso.",
|
||||||
"timestamp": 1762197060.3105035,
|
"timestamp": 1762197549.5293229,
|
||||||
"timestamp_str": "2025-11-03 20:11:00"
|
"timestamp_str": "2025-11-03 19:19:09"
|
||||||
},
|
|
||||||
{
|
|
||||||
"role": "user",
|
|
||||||
"content": "5db",
|
|
||||||
"timestamp": 1762197071.748047,
|
|
||||||
"timestamp_str": "2025-11-03 20:11:11"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"role": "assistant",
|
|
||||||
"content": "Perfetto! Ho alzato il canale 7 a +5 dB. 🔊",
|
|
||||||
"timestamp": 1762197074.7980247,
|
|
||||||
"timestamp_str": "2025-11-03 20:11:14"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -1,135 +1,135 @@
|
|||||||
{
|
{
|
||||||
"user_id": 4762864,
|
"user_id": 4762864,
|
||||||
"username": "unnikked",
|
"username": "unnikked",
|
||||||
"last_updated": 1762197298.3933494,
|
"last_updated": 1762198281.0663533,
|
||||||
"last_updated_str": "2025-11-03 19:14:58",
|
"last_updated_str": "2025-11-03 20:31:21",
|
||||||
"message_count": 21,
|
"message_count": 21,
|
||||||
"history": [
|
"history": [
|
||||||
{
|
{
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": "Perfetto! Ho appena aggiornato completamente la cache del mixer. Ora abbiamo i dati più freschi. ✅\n\nVuoi che rianalizzi il mix della diretta con questi nuovi dati?",
|
"content": "Ciao! Certo, posso alzarti la chitarra nel tuo mix in cuffia.\n\nPrima di tutto, quale chitarra intendi? C'è \"Chit cnt\" (chitarra centrale) e \"Chit dx\" (chitarra destra) nel mix della diretta.\n\nE poi, per favore, dimmi qual è il numero del tuo mix in-ear o del tuo monitor, così so dove alzare il volume.",
|
||||||
"timestamp": 1762196290.869591,
|
"timestamp": 1762197501.4060967,
|
||||||
"timestamp_str": "2025-11-03 19:58:10"
|
"timestamp_str": "2025-11-03 19:18:21"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Sì",
|
"content": "Cnt",
|
||||||
"timestamp": 1762196294.6401505,
|
"timestamp": 1762197513.5233943,
|
||||||
"timestamp_str": "2025-11-03 19:58:14"
|
"timestamp_str": "2025-11-03 19:18:33"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": "Accidenti, Nicola! Ho rianalizzato il Mix 17 (Diretta Streaming) dopo l'aggiornamento della cache, ma i dati sono molto strani. 😬\n\nSembra che il mix sia praticamente **silenzioso**!\n\n🤔 **Problemi Rilevati:**\n* **Tutti i canali sono spenti!** Sia il fader principale del canale (`channel_is_on: False`) che l'invio al mix (`send_is_on: False`) sono disattivati per quasi tutti i canali.\n* I livelli di invio (`send_level_db`) sono tutti a 0.01 dB o 0 dB, il che significa che non sta arrivando quasi nessun segnale al mix.\n* Molti nomi dei canali sono \"Sconosciuto\", il che rende impossibile capire cosa c'è in quel mix.\n* C'è un'anomalia sul Canale 1: il suo nome è una stringa lunghissima di comandi e il suo livello di invio è 6 dB, ma è comunque spento.\n\nIn pratica, con questi valori, il mix della diretta non sta suonando nulla.\n\nÈ quello che ti aspettavi dopo il refresh della cache, o c'è stato qualche problema e vuoi che proviamo a riattivare qualcosa?",
|
"content": "Ok, Nicola, intendi la \"Chit cnt\" (chitarra centrale).\n\nPerò, ho bisogno di sapere qual è il numero del tuo mix in-ear o del tuo monitor. Così posso alzare la chitarra nel mix giusto per te! Qual è il tuo mix?",
|
||||||
"timestamp": 1762196302.7587,
|
"timestamp": 1762197515.409458,
|
||||||
"timestamp_str": "2025-11-03 19:58:22"
|
"timestamp_str": "2025-11-03 19:18:35"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Ora?",
|
"content": "Te l'ho già detto aux2",
|
||||||
"timestamp": 1762196372.0164607,
|
"timestamp": 1762197528.5552773,
|
||||||
"timestamp_str": "2025-11-03 19:59:32"
|
"timestamp_str": "2025-11-03 19:18:48"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": "Allora, Nicola, la situazione è che il mix della diretta è muto perché quasi tutti i canali risultano spenti. Cosa facciamo?\n\nVuoi che provi ad accendere i fader principali di tutti i canali che prima stavano inviando segnale a quel mix? Parlo di voci, chitarre, tastiere, tom e gli altri che avevamo visto.",
|
"content": "Fatto, Nicola! Ho alzato la \"Chit cnt\" nel tuo Aux 2 a +5.6 dB. Dovresti sentirla più forte ora! ✅",
|
||||||
"timestamp": 1762196395.1514723,
|
"timestamp": 1762197538.5911577,
|
||||||
"timestamp_str": "2025-11-03 19:59:55"
|
"timestamp_str": "2025-11-03 19:18:58"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Refresh cache",
|
"content": "Alzami il gelato in cuffia",
|
||||||
"timestamp": 1762196408.1051679,
|
"timestamp": 1762198086.6308124,
|
||||||
"timestamp_str": "2025-11-03 20:00:08"
|
"timestamp_str": "2025-11-03 20:28:06"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": "Perfetto! Ho appena aggiornato completamente la cache del mixer. Ora abbiamo i dati più freschi. ✅\n\nCosa vuoi fare ora? Vuoi che rianalizzi il mix della diretta con questi nuovi dati, o c'è qualcos'altro che ti interessa controllare?",
|
"content": "Fatto, Nicola! Ho alzato il \"Gelato\" nel tuo Aux 2 a +5.0 dB. Dovresti sentirlo più forte ora! 🍦🔊",
|
||||||
"timestamp": 1762196414.9469068,
|
"timestamp": 1762198096.3878605,
|
||||||
"timestamp_str": "2025-11-03 20:00:14"
|
"timestamp_str": "2025-11-03 20:28:16"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Sì",
|
"content": "Perché hai fatto aux2?",
|
||||||
"timestamp": 1762196424.1474867,
|
"timestamp": 1762198124.3196917,
|
||||||
"timestamp_str": "2025-11-03 20:00:24"
|
"timestamp_str": "2025-11-03 20:28:44"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": "Accidenti, Nicola! Ho rianalizzato il Mix 17 (Diretta Streaming) dopo l'aggiornamento della cache, ma la situazione è ancora molto critica. 😬\n\nSembra che il mix sia praticamente **silenzioso**!\n\n🤔 **Problemi Rilevati:**\n* **Il Mix 17 stesso è spento!** Il campo `on: False` nel `mix_details` indica che il mix è disattivato. Questo è il motivo principale per cui non senti nulla.\n* **Tutti i canali inviati al mix sono spenti!** Sia il fader principale del canale (`channel_is_on: False` per molti) che l'invio al mix (`send_is_on: False` per tutti) sono disattivati per quasi tutti i canali.\n* I livelli di invio (`send_level_db`) sono tutti a 0.01 dB o 0 dB, il che significa che non sta arrivando quasi nessun segnale al mix.\n* Molti nomi dei canali sono \"Sconosciuto\", il che rende difficile capire cosa c'è in quel mix.\n* C'è ancora quell'anomalia sul Canale 1: il suo livello di invio è 6 dB, ma è comunque spento.\n\nIn pratica, con questi valori, il mix della diretta non sta suonando nulla.\n\nPer prima cosa, **dobbiamo accendere il Mix 17 stesso**! Poi possiamo pensare ai singoli canali.\n\nVuoi che accenda il Mix 17?",
|
"content": "Hai ragione a chiedere, Nicola! Scusa la confusione.\n\nIl tuo profilo utente dice che il tuo mix assegnato è 'Aux3'. Però, quando mi hai chiesto \"Mi alzi la chitarra in cuffia?\" e ti ho chiesto il numero del tuo mix, tu mi hai risposto \"Te l'ho già detto aux2\".\n\nHo usato 'Aux2' perché me lo hai detto tu esplicitamente.\n\nQual è quello giusto per te? 'Aux2' o 'Aux3'? Voglio essere sicuro di fare le modifiche nel mix corretto!",
|
||||||
"timestamp": 1762196429.8315597,
|
"timestamp": 1762198127.4780977,
|
||||||
"timestamp_str": "2025-11-03 20:00:29"
|
"timestamp_str": "2025-11-03 20:28:47"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Fai un nuovo refresh",
|
"content": "Fai fede alle info del profilo",
|
||||||
"timestamp": 1762196543.7515874,
|
"timestamp": 1762198147.697439,
|
||||||
"timestamp_str": "2025-11-03 20:02:23"
|
"timestamp_str": "2025-11-03 20:29:07"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": "Perfetto! Ho appena aggiornato completamente la cache del mixer. Ora abbiamo i dati più freschi. ✅\n\nCosa vuoi fare ora? Vuoi che rianalizzi il mix della diretta con questi nuovi dati, o c'è qualcos'altro che ti interessa controllare?",
|
"content": "Capito, Nicola! Chiedo scusa per l'errore, hai perfettamente ragione. Farò fede alle informazioni del tuo profilo d'ora in poi.\n\nIl tuo mix assegnato è **'Aux3'**. Userò sempre quello per le tue richieste \"in cuffia\" o \"nel mio monitor\".\n\nHo usato 'Aux2' prima perché me lo avevi indicato tu, ma ora è chiaro che devo attenermi al tuo profilo. Grazie per la precisazione!\n\nC'è qualcos'altro che posso fare per te, sempre tenendo conto che il tuo mix è l'Aux3?",
|
||||||
"timestamp": 1762196551.4148195,
|
"timestamp": 1762198151.41241,
|
||||||
"timestamp_str": "2025-11-03 20:02:31"
|
"timestamp_str": "2025-11-03 20:29:11"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Refresh cache",
|
"content": "Chiudi il gelato",
|
||||||
"timestamp": 1762196862.325504,
|
"timestamp": 1762198170.6018848,
|
||||||
"timestamp_str": "2025-11-03 20:07:42"
|
"timestamp_str": "2025-11-03 20:29:30"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": "Perfetto! Ho appena aggiornato completamente la cache del mixer. Ora abbiamo i dati più freschi. ✅\n\nCosa vuoi fare ora? Vuoi che rianalizzi il mix della diretta con questi nuovi dati, o c'è qualcos'altro che ti interessa controllare?",
|
"content": "Ah, scusa Nicola! Sembra che il nome \"Aux3\" non sia esattamente come è registrato nel mixer, o forse la cache non lo ha ancora. Però, dato che il tuo profilo dice \"Aux3\", userò il **Mix 3** come riferimento, che è la cosa più logica.\n\nHo spento l'invio del canale \"Gelato\" (Canale 2) al tuo Mix 3. Non dovresti più sentirlo in cuffia. 🍦❌",
|
||||||
"timestamp": 1762196864.5258346,
|
"timestamp": 1762198178.0147443,
|
||||||
"timestamp_str": "2025-11-03 20:07:44"
|
"timestamp_str": "2025-11-03 20:29:38"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Non lo hai fatto",
|
"content": "Lo vedo ancora aperto",
|
||||||
"timestamp": 1762196872.262066,
|
"timestamp": 1762198194.62413,
|
||||||
"timestamp_str": "2025-11-03 20:07:52"
|
"timestamp_str": "2025-11-03 20:29:54"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": "Perfetto! Ho appena aggiornato completamente la cache del mixer. Ora abbiamo i dati più freschi. ✅\n\nCosa vuoi fare ora? Vuoi che rianalizzi il mix della diretta con questi nuovi dati, o c'è qualcos'altro che ti interessa controllare?",
|
"content": "Ok, Nicola, ho controllato!\n\nSecondo il mixer, l'invio del canale \"Gelato\" (Canale 2) al **Mix 3** è effettivamente **spento** (OFF) e il livello è a -120 dB, che è silenzio totale. 🍦❌\n\nSe lo vedi ancora \"aperto\", potrebbe esserci un piccolo ritardo nel display che stai guardando, oppure stiamo parlando di un mix diverso.\n\nSe il tuo monitor in cuffia non è il Mix 3, qual è il numero esatto del tuo mix? Oppure, stai guardando il fader principale del canale \"Gelato\" e non il suo invio al tuo mix?",
|
||||||
"timestamp": 1762196879.4402266,
|
"timestamp": 1762198206.2512093,
|
||||||
"timestamp_str": "2025-11-03 20:07:59"
|
"timestamp_str": "2025-11-03 20:30:06"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Ricontrolla",
|
"content": "Refresh la cache e ricontrolla",
|
||||||
"timestamp": 1762196901.1427832,
|
"timestamp": 1762198230.5704525,
|
||||||
"timestamp_str": "2025-11-03 20:08:21"
|
"timestamp_str": "2025-11-03 20:30:30"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": "Ottime notizie, Nicola! Ho ricontrollato il Mix 17 (Diretta Streaming) e la situazione è decisamente migliorata! ✅\n\nIl mix ora è **ACCESO** e ci sono segnali che arrivano! Finalmente si sente qualcosa! 🔊\n\nEcco un'analisi dettagliata:\n\n✅ **Punti di Forza:**\n* Il Mix 17 (Diretta Streaming) è **acceso**! Questo è fondamentale.\n* La maggior parte dei canali sono accesi sia sul fader principale che sull'invio al mix.\n* Il canale ' Vox3' è il più alto a +2.5 dB, il che è ottimo se è la voce principale o del predicatore.\n\n⚠️ **Suggerimenti per Migliorare:**\n* **Tomi un po' troppo alti?** I canali 'Tom 1' (+2 dB) e 'Tom 2' (+2 dB) sono molto vicini al livello della voce principale (' Vox3' a +2.5 dB). Potrebbero risultare un po' invadenti nel mix. Ti suggerirei di provare ad abbassarli di 2-3 dB ciascuno per dare più spazio alla voce.\n* **Chitarra destra un po' bassa?** Il canale 'Chit dx' è a -9 dB. Se è una chitarra importante nel mix, potrebbe essere un po' troppo indietro. Prova ad alzarla di 3-5 dB per farla sentire meglio.\n* **Pan SX e Pan DX:** I canali 'Pan SX' e 'Pan dx' sono a -7 dB. Se sono parte di un elemento stereo, assicurati che siano bilanciati tra loro e con il resto del mix.\n\n🤔 **Problemi Rilevati:**\n* Il canale 'Talkback' (Canale 3) è spento sia sul fader che sull'invio, ma questo è normale e corretto per un mix di diretta.\n\nIn sintesi, il mix è vivo! Ora possiamo lavorare sull'equilibrio. Cosa ne pensi di questi suggerimenti? Vuoi che proviamo a modificare qualcosa?",
|
"content": "Ok, Nicola, ho aggiornato la cache e ricontrollato.\n\nIl canale \"Gelato\" (Canale 2) è **spento** (OFF) per l'invio al tuo Mix 3, anche se il livello di send è impostato a +6.0 dB. Questo significa che, anche se il fader di send è alto, il segnale non sta passando perché l'invio è disattivato.\n\nSe lo vedi ancora \"aperto\" sul tuo display, potrebbe essere un'indicazione visiva del livello impostato, ma l'audio non dovrebbe arrivare al tuo Mix 3.\n\nVuoi che lo accenda, così il segnale arriva?",
|
||||||
"timestamp": 1762196917.149256,
|
"timestamp": 1762198239.2318952,
|
||||||
"timestamp_str": "2025-11-03 20:08:37"
|
"timestamp_str": "2025-11-03 20:30:39"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Elencami i canali e i valori del mix diretta",
|
"content": "Accendilo e spegnilo",
|
||||||
"timestamp": 1762196952.705826,
|
"timestamp": 1762198267.3801525,
|
||||||
"timestamp_str": "2025-11-03 20:09:12"
|
"timestamp_str": "2025-11-03 20:31:07"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": "Certo, Nicola! Ecco l'elenco dei canali che stanno inviando segnale al Mix 17 (Diretta Streaming), con i loro livelli e stati:\n\n**Mix 17 (Diretta Streaming) - Canali e Valori:**\n\n* **Canale 23 (' Vox3')**: Livello: **+2.5 dB** (Acceso ✅, Send Acceso ✅)\n* **Canale 11 ('Tom 1')**: Livello: **+2 dB** (Acceso ✅, Send Acceso ✅)\n* **Canale 12 ('Tom 2')**: Livello: **+2 dB** (Acceso ✅, Send Acceso ✅)\n* **Canale 18 ('Archetto')**: Livello: **+1.6 dB** (Acceso ✅, Send Acceso ✅)\n* **Canale 2 ('Gelato')**: Livello: **+1.35 dB** (Acceso ✅, Send Acceso ✅)\n* **Canale 6 ('Vox2')**: Livello: **+1 dB** (Acceso ✅, Send Acceso ✅)\n* **Canale 9 ('Kick')**: Livello: **0 dB** (Acceso ✅, Send Acceso ✅)\n* **Canale 10 ('Snare')**: Livello: **-1 dB** (Acceso ✅, Send Acceso ✅)\n* **Canale 13 ('Tom3')**: Livello: **-1 dB** (Acceso ✅, Send Acceso ✅)\n* **Canale 20 ('Tast')**: Livello: **-2 dB** (Acceso ✅, Send Acceso ✅)\n* **Canale 24 ('Chit cnt')**: Livello: **-5 dB** (Acceso ✅, Send Acceso ✅)\n* **Canale 14 ('Pan SX')**: Livello: **-7 dB** (Acceso ✅, Send Acceso ✅)\n* **Canale 15 ('Pan dx')**: Livello: **-7 dB** (Acceso ✅, Send Acceso ✅)\n* **Canale 25 ('Chit dx')**: Livello: **-9 dB** (Acceso ✅, Send Acceso ✅)\n* **Canale 3 ('Talkback')**: Livello: **-99 dB** (Spento ❌, Send Spento ❌) - *Questo è normale per il talkback.*\n\nFammi sapere se vuoi modificare qualche livello o lo stato di qualche canale!",
|
"content": "Fatto! Ho acceso e poi spento l'invio del \"Gelato\" (Canale 2) al tuo Mix 3. Ora dovrebbe essere definitivamente chiuso. 🍦❌",
|
||||||
"timestamp": 1762196959.5204484,
|
"timestamp": 1762198271.9373705,
|
||||||
"timestamp_str": "2025-11-03 20:09:19"
|
"timestamp_str": "2025-11-03 20:31:11"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Hello",
|
"content": "Esatto bravo",
|
||||||
"timestamp": 1762197296.4190717,
|
"timestamp": 1762198279.3314657,
|
||||||
"timestamp_str": "2025-11-03 19:14:56"
|
"timestamp_str": "2025-11-03 20:31:19"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": "Ciao Nicola! Come posso aiutarti oggi con il mixer?",
|
"content": "Perfetto, Nicola! Sono contento che abbiamo risolto. ✅\n\nC'è qualcos'altro che posso fare per te?",
|
||||||
"timestamp": 1762197298.3932998,
|
"timestamp": 1762198281.0663533,
|
||||||
"timestamp_str": "2025-11-03 19:14:58"
|
"timestamp_str": "2025-11-03 20:31:21"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"user_id": 1073121360,
|
|
||||||
"username": "Ingdavidfeliz",
|
|
||||||
"role": "mixerista",
|
|
||||||
"display_name": "David",
|
|
||||||
"channels": [],
|
|
||||||
"mixes": [],
|
|
||||||
"setup_completed": true,
|
|
||||||
"created_at": 1762197000.7585375,
|
|
||||||
"created_at_str": "2025-11-03 20:10:00",
|
|
||||||
"last_updated": 1762197025.8351762,
|
|
||||||
"last_updated_str": "2025-11-03 20:10:25"
|
|
||||||
}
|
|
||||||
@@ -1,13 +1,17 @@
|
|||||||
{
|
{
|
||||||
"user_id": 4762864,
|
"user_id": 4762864,
|
||||||
"username": "unnikked",
|
"username": "unnikked",
|
||||||
"role": "mixerista",
|
"role": "cantante",
|
||||||
"display_name": "Nicola",
|
"display_name": "Nicola",
|
||||||
"channels": [],
|
"channel_labels": [
|
||||||
"mixes": [],
|
"Vox1"
|
||||||
|
],
|
||||||
|
"mix_labels": [
|
||||||
|
"Aux3"
|
||||||
|
],
|
||||||
"setup_completed": true,
|
"setup_completed": true,
|
||||||
"created_at": 1762193898.87283,
|
"created_at": 1762198047.365003,
|
||||||
"created_at_str": "2025-11-03 19:18:18",
|
"created_at_str": "2025-11-03 20:27:27",
|
||||||
"last_updated": 1762193916.4840386,
|
"last_updated": 1762198068.4479709,
|
||||||
"last_updated_str": "2025-11-03 19:18:36"
|
"last_updated_str": "2025-11-03 20:27:48"
|
||||||
}
|
}
|
||||||
251
telegram_bot.py
251
telegram_bot.py
@@ -63,8 +63,8 @@ class UserProfile:
|
|||||||
self.username = username
|
self.username = username
|
||||||
self.role: Optional[str] = None
|
self.role: Optional[str] = None
|
||||||
self.display_name: Optional[str] = None
|
self.display_name: Optional[str] = None
|
||||||
self.channels: List[int] = [] # Canali assegnati
|
self.channel_labels: List[str] = [] # Etichette dei canali assegnati
|
||||||
self.mixes: List[int] = [] # Mix/aux assegnati
|
self.mix_labels: List[str] = [] # Etichette dei mix/aux assegnati
|
||||||
self.setup_completed = False
|
self.setup_completed = False
|
||||||
self.created_at = time.time()
|
self.created_at = time.time()
|
||||||
self.last_updated = time.time()
|
self.last_updated = time.time()
|
||||||
@@ -76,8 +76,8 @@ class UserProfile:
|
|||||||
"username": self.username,
|
"username": self.username,
|
||||||
"role": self.role,
|
"role": self.role,
|
||||||
"display_name": self.display_name,
|
"display_name": self.display_name,
|
||||||
"channels": self.channels,
|
"channel_labels": self.channel_labels,
|
||||||
"mixes": self.mixes,
|
"mix_labels": self.mix_labels,
|
||||||
"setup_completed": self.setup_completed,
|
"setup_completed": self.setup_completed,
|
||||||
"created_at": self.created_at,
|
"created_at": self.created_at,
|
||||||
"created_at_str": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(self.created_at)),
|
"created_at_str": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(self.created_at)),
|
||||||
@@ -91,8 +91,8 @@ class UserProfile:
|
|||||||
profile = cls(data["user_id"], data["username"])
|
profile = cls(data["user_id"], data["username"])
|
||||||
profile.role = data.get("role")
|
profile.role = data.get("role")
|
||||||
profile.display_name = data.get("display_name")
|
profile.display_name = data.get("display_name")
|
||||||
profile.channels = data.get("channels", [])
|
profile.channel_labels = data.get("channel_labels", [])
|
||||||
profile.mixes = data.get("mixes", [])
|
profile.mix_labels = data.get("mix_labels", [])
|
||||||
profile.setup_completed = data.get("setup_completed", False)
|
profile.setup_completed = data.get("setup_completed", False)
|
||||||
profile.created_at = data.get("created_at", time.time())
|
profile.created_at = data.get("created_at", time.time())
|
||||||
profile.last_updated = data.get("last_updated", time.time())
|
profile.last_updated = data.get("last_updated", time.time())
|
||||||
@@ -102,36 +102,6 @@ class UserProfile:
|
|||||||
"""Restituisce le info sul ruolo."""
|
"""Restituisce le info sul ruolo."""
|
||||||
return self.ROLES.get(self.role, {})
|
return self.ROLES.get(self.role, {})
|
||||||
|
|
||||||
def can_access_channel(self, channel: int) -> bool:
|
|
||||||
"""Verifica se l'utente può accedere a un canale."""
|
|
||||||
if not self.role:
|
|
||||||
return False
|
|
||||||
|
|
||||||
permissions = self.get_role_info().get("permissions", [])
|
|
||||||
|
|
||||||
if "all" in permissions:
|
|
||||||
return True
|
|
||||||
|
|
||||||
if "own_channel" in permissions:
|
|
||||||
return channel in self.channels
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
|
||||||
def can_access_mix(self, mix: int) -> bool:
|
|
||||||
"""Verifica se l'utente può accedere a un mix."""
|
|
||||||
if not self.role:
|
|
||||||
return False
|
|
||||||
|
|
||||||
permissions = self.get_role_info().get("permissions", [])
|
|
||||||
|
|
||||||
if "all" in permissions:
|
|
||||||
return True
|
|
||||||
|
|
||||||
if "own_mix" in permissions:
|
|
||||||
return mix in self.mixes
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
|
||||||
def get_summary(self) -> str:
|
def get_summary(self) -> str:
|
||||||
"""Restituisce un riepilogo del profilo."""
|
"""Restituisce un riepilogo del profilo."""
|
||||||
if not self.setup_completed:
|
if not self.setup_completed:
|
||||||
@@ -140,15 +110,14 @@ class UserProfile:
|
|||||||
role_info = self.get_role_info()
|
role_info = self.get_role_info()
|
||||||
msg = f"{role_info['emoji']} **{self.display_name}** ({role_info['name']})\n\n"
|
msg = f"{role_info['emoji']} **{self.display_name}** ({role_info['name']})\n\n"
|
||||||
|
|
||||||
if self.channels:
|
if self.channel_labels:
|
||||||
msg += f"🎚️ Canali: {', '.join(map(str, self.channels))}\n"
|
msg += f"🎚️ Canali: {', '.join(self.channel_labels)}\n"
|
||||||
|
|
||||||
if self.mixes:
|
if self.mix_labels:
|
||||||
msg += f"🔊 Mix: {', '.join(map(str, self.mixes))}\n"
|
msg += f"🔊 Mix: {', '.join(self.mix_labels)}\n"
|
||||||
|
|
||||||
return msg
|
return msg
|
||||||
|
|
||||||
|
|
||||||
class ProfileManager:
|
class ProfileManager:
|
||||||
"""Gestisce i profili utente."""
|
"""Gestisce i profili utente."""
|
||||||
|
|
||||||
@@ -221,7 +190,6 @@ class ProfileManager:
|
|||||||
|
|
||||||
return profiles
|
return profiles
|
||||||
|
|
||||||
|
|
||||||
class ConversationManager:
|
class ConversationManager:
|
||||||
"""Gestisce il salvataggio delle conversazioni su file JSON."""
|
"""Gestisce il salvataggio delle conversazioni su file JSON."""
|
||||||
|
|
||||||
@@ -289,7 +257,6 @@ class ConversationManager:
|
|||||||
print(f"❌ Errore nell'eliminazione conversazione {user_id}: {e}")
|
print(f"❌ Errore nell'eliminazione conversazione {user_id}: {e}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
class TelegramBot:
|
class TelegramBot:
|
||||||
"""Bot Telegram base con long polling."""
|
"""Bot Telegram base con long polling."""
|
||||||
|
|
||||||
@@ -423,7 +390,7 @@ class TF5TelegramBot:
|
|||||||
self.controller.set_channel_to_mix_level,
|
self.controller.set_channel_to_mix_level,
|
||||||
self.controller.set_channel_to_mix_on_off,
|
self.controller.set_channel_to_mix_on_off,
|
||||||
self.controller.get_channel_to_mix_info,
|
self.controller.get_channel_to_mix_info,
|
||||||
self.controller.get_full_mix_details, # <-- NUOVA FUNZIONE AGGIUNTA
|
self.controller.get_full_mix_details,
|
||||||
],
|
],
|
||||||
temperature=0,
|
temperature=0,
|
||||||
)
|
)
|
||||||
@@ -568,13 +535,17 @@ Devi essere veloce, chiaro e capire anche richieste approssimative.
|
|||||||
instruction += f"Nome: {profile.display_name}\n"
|
instruction += f"Nome: {profile.display_name}\n"
|
||||||
instruction += f"Ruolo: {role_info['name']} {role_info['emoji']}\n"
|
instruction += f"Ruolo: {role_info['name']} {role_info['emoji']}\n"
|
||||||
|
|
||||||
if profile.channels:
|
if profile.channel_labels:
|
||||||
instruction += f"\nCanali assegnati: {', '.join(map(str, profile.channels))}\n"
|
labels_str = ', '.join([f"'{l}'" for l in profile.channel_labels])
|
||||||
instruction += "Quando l'utente dice 'il mio canale' o 'il mio mic/strumento', si riferisce a questi.\n"
|
instruction += f"\nNomi dei canali assegnati: {labels_str}\n"
|
||||||
|
instruction += "Quando l'utente dice 'il mio canale' o 'il mio mic/strumento', si riferisce a questi. "
|
||||||
|
instruction += "**DEVI usare `search_channels_by_name` con questi nomi per trovare il numero di canale corretto prima di eseguire qualsiasi altra azione.**\n"
|
||||||
|
|
||||||
if profile.mixes:
|
if profile.mix_labels:
|
||||||
instruction += f"\nMix assegnati: {', '.join(map(str, profile.mixes))}\n"
|
labels_str = ', '.join([f"'{l}'" for l in profile.mix_labels])
|
||||||
instruction += "Quando l'utente dice 'le mie cuffie', 'il mio monitor', 'in cuffia', si riferisce a questi mix.\n"
|
instruction += f"\nNomi dei mix assegnati: {labels_str}\n"
|
||||||
|
instruction += "Quando l'utente dice 'le mie cuffie', 'il mio monitor', 'in cuffia', si riferisce a questi mix. "
|
||||||
|
instruction += "**DEVI usare `search_mixes_by_name` con questi nomi per trovare il numero di mix corretto prima di eseguire qualsiasi altra azione.**\n"
|
||||||
|
|
||||||
# Istruzioni specifiche per ruolo
|
# Istruzioni specifiche per ruolo
|
||||||
permissions = role_info.get("permissions", [])
|
permissions = role_info.get("permissions", [])
|
||||||
@@ -587,77 +558,27 @@ Devi essere veloce, chiaro e capire anche richieste approssimative.
|
|||||||
else:
|
else:
|
||||||
instruction += f"\n⚠️ LIMITAZIONI DI ACCESSO ({role_info['name']}):\n"
|
instruction += f"\n⚠️ LIMITAZIONI DI ACCESSO ({role_info['name']}):\n"
|
||||||
|
|
||||||
if "own_channel" in permissions and profile.channels:
|
if "own_channel" in permissions and profile.channel_labels:
|
||||||
instruction += f"- Canali controllabili: SOLO {', '.join(map(str, profile.channels))}\n"
|
instruction += f"- Canali controllabili: SOLO quelli che corrispondono ai nomi nel tuo profilo.\n"
|
||||||
|
|
||||||
if "own_mix" in permissions and profile.mixes:
|
if "own_mix" in permissions and profile.mix_labels:
|
||||||
instruction += f"- Mix controllabili: SOLO {', '.join(map(str, profile.mixes))}\n"
|
instruction += f"- Mix controllabili: SOLO quelli che corrispondono ai nomi nel tuo profilo.\n"
|
||||||
instruction += f"- Puoi gestire i send di QUALSIASI canale verso i TUOI mix ({', '.join(map(str, profile.mixes))})\n"
|
instruction += f"- Puoi gestire i send di QUALSIASI canale verso i TUOI mix.\n"
|
||||||
|
|
||||||
instruction += "\n❌ NON puoi:\n"
|
instruction += "\n❌ NON puoi:\n"
|
||||||
if "own_channel" not in permissions:
|
instruction += "- Caricare scene (solo i mixeristi).\n"
|
||||||
instruction += "- Modificare il volume/stato dei canali\n"
|
instruction += "- Accedere a canali/mix non associati al tuo profilo.\n"
|
||||||
if "own_mix" not in permissions:
|
|
||||||
instruction += "- Modificare il volume/stato dei mix\n"
|
|
||||||
instruction += "- Caricare scene (solo i mixeristi)\n"
|
|
||||||
instruction += "- Accedere a canali/mix non assegnati\n"
|
|
||||||
|
|
||||||
instruction += "\n💡 INTERPRETAZIONE RICHIESTE:\n"
|
instruction += "\n💡 INTERPRETAZIONE RICHIESTE:\n"
|
||||||
instruction += "- 'alzami la chitarra' = alza il send della chitarra nel TUO mix\n"
|
instruction += "- 'alzami la chitarra' = alza il send della chitarra nel TUO mix (identificato dal suo nome).\n"
|
||||||
instruction += "- 'più voce' = alza il send della voce nel TUO mix\n"
|
instruction += "- 'più voce' = alza il send della voce nel TUO mix.\n"
|
||||||
instruction += "- 'meno batteria in cuffia' = abbassa il send della batteria nel TUO mix\n"
|
instruction += "- 'meno batteria in cuffia' = abbassa il send della batteria nel TUO mix.\n"
|
||||||
instruction += "- Se l'utente chiede di fare qualcosa fuori dai suoi permessi, spiega gentilmente che non può e suggerisci di chiedere al mixerista\n"
|
instruction += "- Se l'utente chiede di fare qualcosa fuori dai suoi permessi, spiega gentilmente che non può e suggerisci di chiedere al mixerista.\n"
|
||||||
|
|
||||||
instruction += f"\n{'='*70}\n"
|
instruction += f"\n{'='*70}\n"
|
||||||
|
|
||||||
return instruction
|
return instruction
|
||||||
|
|
||||||
def _check_permission(self, profile: UserProfile, operation: str,
|
|
||||||
channel: Optional[int] = None,
|
|
||||||
mix: Optional[int] = None) -> tuple[bool, str]:
|
|
||||||
"""
|
|
||||||
Verifica se l'utente ha i permessi per un'operazione.
|
|
||||||
Ritorna (permitted, error_message)
|
|
||||||
"""
|
|
||||||
if not profile.setup_completed:
|
|
||||||
return False, "⚠️ Devi prima configurare il tuo profilo con /setup"
|
|
||||||
|
|
||||||
role_info = profile.get_role_info()
|
|
||||||
permissions = role_info.get("permissions", [])
|
|
||||||
|
|
||||||
# Mixeristi possono fare tutto
|
|
||||||
if "all" in permissions:
|
|
||||||
return True, ""
|
|
||||||
|
|
||||||
# Verifica permessi specifici
|
|
||||||
if operation in ["set_channel_level", "set_channel_on_off", "set_channel_pan",
|
|
||||||
"mute_multiple_channels", "unmute_multiple_channels"]:
|
|
||||||
if "own_channel" not in permissions:
|
|
||||||
return False, "❌ Solo i mixeristi possono controllare i canali direttamente"
|
|
||||||
|
|
||||||
if channel and not profile.can_access_channel(channel):
|
|
||||||
return False, f"❌ Non hai accesso al canale {channel}. I tuoi canali: {', '.join(map(str, profile.channels))}"
|
|
||||||
|
|
||||||
if operation in ["set_mix_level", "set_mix_on_off", "get_full_mix_details"]:
|
|
||||||
if "own_mix" not in permissions:
|
|
||||||
return False, "❌ Non hai permessi per controllare i mix"
|
|
||||||
|
|
||||||
if mix and not profile.can_access_mix(mix):
|
|
||||||
return False, f"❌ Non hai accesso al mix {mix}. I tuoi mix: {', '.join(map(str, profile.mixes))}"
|
|
||||||
|
|
||||||
if operation == "recall_scene":
|
|
||||||
return False, "❌ Solo i mixeristi possono caricare scene"
|
|
||||||
|
|
||||||
# Le operazioni di send ai mix sono permesse se hai accesso al mix di destinazione
|
|
||||||
if operation in ["set_channel_to_mix_level", "set_channel_to_mix_on_off"]:
|
|
||||||
if "own_mix" not in permissions:
|
|
||||||
return False, "❌ Non hai permessi per controllare i send ai mix"
|
|
||||||
|
|
||||||
if mix and not profile.can_access_mix(mix):
|
|
||||||
return False, f"❌ Non hai accesso al mix {mix}. I tuoi mix: {', '.join(map(str, profile.mixes))}"
|
|
||||||
|
|
||||||
return True, ""
|
|
||||||
|
|
||||||
def get_profile(self, user_id: int, username: str) -> UserProfile:
|
def get_profile(self, user_id: int, username: str) -> UserProfile:
|
||||||
"""Ottiene il profilo di un utente."""
|
"""Ottiene il profilo di un utente."""
|
||||||
if user_id not in self.profiles:
|
if user_id not in self.profiles:
|
||||||
@@ -726,7 +647,6 @@ Devi essere veloce, chiaro e capire anche richieste approssimative.
|
|||||||
role_info = profile.get_role_info()
|
role_info = profile.get_role_info()
|
||||||
permissions = role_info.get("permissions", [])
|
permissions = role_info.get("permissions", [])
|
||||||
|
|
||||||
# Se è mixerista, ha finito
|
|
||||||
if "all" in permissions:
|
if "all" in permissions:
|
||||||
profile.setup_completed = True
|
profile.setup_completed = True
|
||||||
self.profile_manager.save_profile(profile)
|
self.profile_manager.save_profile(profile)
|
||||||
@@ -740,59 +660,47 @@ Devi essere veloce, chiaro e capire anche richieste approssimative.
|
|||||||
f"• 'Richiama la scena A10'\n"
|
f"• 'Richiama la scena A10'\n"
|
||||||
f"• 'Mostrami tutti i canali'")
|
f"• 'Mostrami tutti i canali'")
|
||||||
|
|
||||||
# Altrimenti, chiedi i canali (se necessario)
|
|
||||||
if "own_channel" in permissions:
|
if "own_channel" in permissions:
|
||||||
self.bot.send_message(
|
self.bot.send_message(
|
||||||
user_id,
|
user_id,
|
||||||
f"🎚️ Quali canali usi?\n\n"
|
f"🎚️ **Come si chiama il tuo canale/strumento?**\n\n"
|
||||||
f"Esempi:\n"
|
f"Scrivi il nome esatto che vedi sull'etichetta del mixer (es: 'VOX Marco', 'CH Acustica').\n"
|
||||||
f"• Un canale: 5\n"
|
f"Se hai più canali, separali con una virgola (es: 'Tastiera L', 'Tastiera R').\n\n"
|
||||||
f"• Più canali: 5, 7, 12\n"
|
f"(Scrivi 'nessuno' se non hai un canale specifico)"
|
||||||
f"• Range: 5-8 (canali 5, 6, 7, 8)\n"
|
|
||||||
f"• Misti: 3, 5-7, 10\n\n"
|
|
||||||
f"(Scrivi 0 se non usi canali diretti)"
|
|
||||||
)
|
)
|
||||||
self.setup_states[user_id] = {"step": "channels", "role": profile.role}
|
self.setup_states[user_id] = {"step": "channels"}
|
||||||
return ""
|
elif "own_mix" in permissions:
|
||||||
else:
|
|
||||||
# Salta direttamente ai mix
|
|
||||||
self.bot.send_message(
|
self.bot.send_message(
|
||||||
user_id,
|
user_id,
|
||||||
f"🔊 Quali mix/aux usi per le tue cuffie o uscita?\n\n"
|
f"🔊 **Come si chiama il tuo mix per le cuffie/monitor?**\n\n"
|
||||||
f"Esempi:\n"
|
f"Scrivi il nome esatto (es: 'InEar Marco', 'Cuffia Palco Sx').\n"
|
||||||
f"• Un mix: 3\n"
|
f"Se usi un mix stereo, scrivi entrambi i nomi separati da virgola (es: 'IEM L', 'IEM R').\n\n"
|
||||||
f"• Più mix: 3, 5\n"
|
f"(Scrivi 'nessuno' se non usi un mix specifico)"
|
||||||
f"• Range: 3-5\n"
|
|
||||||
f"• Mix stereo: 9, 10 (in-ear stereo)\n\n"
|
|
||||||
f"(Scrivi 0 se non usi mix specifici)"
|
|
||||||
)
|
)
|
||||||
self.setup_states[user_id] = {"step": "mixes", "role": profile.role}
|
self.setup_states[user_id] = {"step": "mixes"}
|
||||||
return ""
|
|
||||||
|
return ""
|
||||||
|
|
||||||
# Step: inserimento canali
|
# Step: inserimento etichette canali
|
||||||
elif step == "channels":
|
elif step == "channels":
|
||||||
channels = self._parse_channel_list(text)
|
labels_text = text.strip()
|
||||||
profile.channels = channels
|
if labels_text.lower() != 'nessuno':
|
||||||
|
profile.channel_labels = [label.strip() for label in labels_text.split(',')]
|
||||||
|
|
||||||
role_info = profile.get_role_info()
|
role_info = profile.get_role_info()
|
||||||
permissions = role_info.get("permissions", [])
|
permissions = role_info.get("permissions", [])
|
||||||
|
|
||||||
# Chiedi i mix se necessario
|
|
||||||
if "own_mix" in permissions:
|
if "own_mix" in permissions:
|
||||||
self.bot.send_message(
|
self.bot.send_message(
|
||||||
user_id,
|
user_id,
|
||||||
f"🔊 Quali mix/aux usi per le tue cuffie o uscita?\n\n"
|
f"🔊 **Come si chiama il tuo mix per le cuffie/monitor?**\n\n"
|
||||||
f"Esempi:\n"
|
f"Scrivi il nome esatto (es: 'InEar Marco', 'Cuffia Palco Sx').\n"
|
||||||
f"• Un mix: 3\n"
|
f"Se usi un mix stereo, scrivi entrambi i nomi separati da virgola (es: 'IEM L', 'IEM R').\n\n"
|
||||||
f"• Più mix: 3, 5\n"
|
f"(Scrivi 'nessuno' se non usi un mix specifico)"
|
||||||
f"• Range: 3-5\n"
|
|
||||||
f"• Mix stereo: 9, 10 (in-ear stereo)\n\n"
|
|
||||||
f"(Scrivi 0 se non usi mix specifici)"
|
|
||||||
)
|
)
|
||||||
self.setup_states[user_id] = {"step": "mixes", "role": profile.role}
|
self.setup_states[user_id] = {"step": "mixes"}
|
||||||
return ""
|
return ""
|
||||||
else:
|
else:
|
||||||
# Finito
|
|
||||||
profile.setup_completed = True
|
profile.setup_completed = True
|
||||||
self.profile_manager.save_profile(profile)
|
self.profile_manager.save_profile(profile)
|
||||||
del self.setup_states[user_id]
|
del self.setup_states[user_id]
|
||||||
@@ -803,59 +711,32 @@ Devi essere veloce, chiaro e capire anche richieste approssimative.
|
|||||||
f"• 'Alza il mio canale'\n"
|
f"• 'Alza il mio canale'\n"
|
||||||
f"• 'Spegni il mio mic'")
|
f"• 'Spegni il mio mic'")
|
||||||
|
|
||||||
# Step: inserimento mix
|
# Step: inserimento etichette mix
|
||||||
elif step == "mixes":
|
elif step == "mixes":
|
||||||
mixes = self._parse_channel_list(text) # Stessa logica per i mix
|
labels_text = text.strip()
|
||||||
profile.mixes = mixes
|
if labels_text.lower() != 'nessuno':
|
||||||
|
profile.mix_labels = [label.strip() for label in labels_text.split(',')]
|
||||||
|
|
||||||
profile.setup_completed = True
|
profile.setup_completed = True
|
||||||
self.profile_manager.save_profile(profile)
|
self.profile_manager.save_profile(profile)
|
||||||
del self.setup_states[user_id]
|
del self.setup_states[user_id]
|
||||||
|
|
||||||
role_info = profile.get_role_info()
|
|
||||||
|
|
||||||
example_commands = []
|
example_commands = []
|
||||||
if profile.channels:
|
if profile.channel_labels:
|
||||||
example_commands.append("• 'Alza il mio canale'")
|
example_commands.append("• 'Alza il volume del mio canale'")
|
||||||
if profile.mixes:
|
if profile.mix_labels:
|
||||||
example_commands.extend([
|
example_commands.extend([
|
||||||
"• 'Alzami la chitarra' (nel tuo mix)",
|
"• 'Alzami la chitarra nel mio monitor'",
|
||||||
"• 'Più voce in cuffia'",
|
"• 'Più voce in cuffia'",
|
||||||
"• 'Meno batteria'"
|
"• 'Meno batteria'"
|
||||||
])
|
])
|
||||||
|
|
||||||
return (f"✅ Configurazione completata!\n\n"
|
return (f"✅ Configurazione completata!\n\n"
|
||||||
f"{profile.get_summary()}\n"
|
f"{profile.get_summary()}\n\n"
|
||||||
f"Esempi di comandi:\n" + "\n".join(example_commands))
|
f"Esempi di comandi che puoi usare:\n" + "\n".join(example_commands))
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
def _parse_channel_list(self, text: str) -> List[int]:
|
|
||||||
"""Parse una lista di canali/mix dal testo utente."""
|
|
||||||
channels = []
|
|
||||||
|
|
||||||
# Rimuovi spazi e split per virgola
|
|
||||||
parts = [p.strip() for p in text.split(',')]
|
|
||||||
|
|
||||||
for part in parts:
|
|
||||||
# Range (es: 5-8)
|
|
||||||
if '-' in part:
|
|
||||||
try:
|
|
||||||
start, end = map(int, part.split('-'))
|
|
||||||
channels.extend(range(start, end + 1))
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
# Singolo numero
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
num = int(part)
|
|
||||||
if num > 0: # Ignora 0
|
|
||||||
channels.append(num)
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
return sorted(list(set(channels))) # Rimuovi duplicati e ordina
|
|
||||||
|
|
||||||
def _get_file_path(self, file_id: str) -> str:
|
def _get_file_path(self, file_id: str) -> str:
|
||||||
"""Richiede a Telegram il percorso di un file."""
|
"""Richiede a Telegram il percorso di un file."""
|
||||||
result = self.bot._make_request("getFile", {"file_id": file_id})
|
result = self.bot._make_request("getFile", {"file_id": file_id})
|
||||||
@@ -1006,10 +887,10 @@ Devi essere veloce, chiaro e capire anche richieste approssimative.
|
|||||||
msg += "• 'Analizza il mix 15 per la diretta'\n"
|
msg += "• 'Analizza il mix 15 per la diretta'\n"
|
||||||
else:
|
else:
|
||||||
msg += "**Esempi di comandi:**\n"
|
msg += "**Esempi di comandi:**\n"
|
||||||
if profile.channels:
|
if profile.channel_labels:
|
||||||
msg += "• 'Alza il mio canale'\n"
|
msg += "• 'Alza il mio canale'\n"
|
||||||
msg += "• 'Spegni il mio mic'\n"
|
msg += "• 'Spegni il mio mic'\n"
|
||||||
if profile.mixes:
|
if profile.mix_labels:
|
||||||
msg += "• 'Alzami la chitarra' (nel tuo mix)\n"
|
msg += "• 'Alzami la chitarra' (nel tuo mix)\n"
|
||||||
msg += "• 'Più voce in cuffia'\n"
|
msg += "• 'Più voce in cuffia'\n"
|
||||||
msg += "• 'Analizza il mio mix per la diretta'\n"
|
msg += "• 'Analizza il mio mix per la diretta'\n"
|
||||||
|
|||||||
Reference in New Issue
Block a user