import Foundation #if canImport(FoundationNetworking) import FoundationNetworking #endif import XMLCoder import DiscordBM struct Wolfram { static let token = ProcessInfo.processInfo.environment["WOLFRAM_APP_ID"]! static let apiUrl = "http://api.wolframalpha.com/v2/query" static func getWolfram(_ question: String) async throws -> (String, URL?) { let encQuestion = question.addingPercentEncoding(withAllowedCharacters: .alphanumerics) let url = URL(string: "\(apiUrl)?appid=\(token)&input=\(encQuestion!)")! let (data, _) = try await URLSession.shared.data(from: url) let wolframRes = try XMLDecoder().decode(WolframQueryResult.self, from: data) let resultPod = wolframRes.pod.first(where: { $0.primary ?? false || $0.id == "Result" }) var ans: String? var img: URL? if let resultPod = resultPod { ans = String(resultPod.subpod.compactMap(\.plaintext).joined(by: "\n")) .replacingOccurrences(of: " | ", with: ": ") } if let imgPod = wolframRes.pod.first(where: { ["RootPlot", "NumberLine", "Plot", "ImplicitPlot", "3DPlot"].contains($0.id) || ($0.id == "Example" && $0.scanner == "Dice") }) { ans = ans ?? "Plot:" img = imgPod.subpod.first?.img.src } if ans == nil, let maybePod = wolframRes.pod.first(where: { $0.title == "Input interpretation" }), let maybeText = maybePod.subpod.first?.plaintext .replacingOccurrences(of: " | ", with: ": ") { ans = "<:smol_rise:852763040452575252> I don't know. Maybe you meant '\(maybeText)'" } return (ans ?? "<:smol_rise:852763040452575252> sorry, I have no idea (ยด._.`)", img) } static func handleMath( _ args: ArraySlice, client: DiscordClient, ctx: Gateway.MessageCreate ) async throws { try await client.triggerTypingIndicator(channelId: ctx.channel_id).guardSuccess() let question = String(args.joined(by: " ")) let (answer, img) = try await getWolfram(question) var attachments: [Payloads.Attachment] = [] var files: [RawFile] = [] if let img = img { let data = try? await URLSession.shared.data(from: img) if let data = data?.0 { attachments.append(.init(index: 0, filename: "img.gif")) files.append(.init(data: .init(data: data), filename: "img.gif")) } } try await client.createMessage(channelId: ctx.channel_id, payload: .init( content: answer, message_reference: .init( type: .default, message_id: ctx.id, channel_id: ctx.channel_id, guild_id: ctx.guild_id, ), files: files, attachments: attachments )).guardSuccess() } } struct WolframQueryResult: Codable { struct Pod: Codable { let title: String let id: String let scanner: String let primary: Bool? let subpod: [Subpod] } struct Subpod: Codable { let title: String let img: Image let plaintext: String } struct Image: Codable { let src: URL } let success: Bool let numpods: Int let pod: [Pod] }