!7 cmodule DiscordFan > DynPrintLogAndEnabled { transient Map protos = syncCIMap(); ISegmenter segmenter; transient new ScreenShooter shooter; transient ReliableSingleThread rstSegment = dm_rst(module(), r segment); transient ReliableSingleThread rstAOA = dm_rst(module(), r aoa); transient ImageInfo info; transient ImageInfo latestWithAOA; transient ImageSurface isThings; transient double minScore = 95; sclass ImageInfo { BufferedImage image; L segments; new AOA_CompareImagesToProtos aoa; } visual jhsplit( jCenteredSection("Things found on screen", jscroll_center(isThings = jImageSurface())), super); start-thread { dm_watchField enabled(r { set(shooter, +enabled); }); if (empty(protos)) putAll(protos, mapValues loadBWImage(imageSnippetIDsForNames(llQuoted("Open", "Open discord")))); print("Have " + n2(protos, "proto")); if (segmenter == null) setField(segmenter := segmenterFromAGIBlue("Find things on discordapp.com #1")); print("Have segmenter: " + segmenter); shooter.onNewImage.add(voidfunc(BufferedImage img) { rstSegment.trigger(); }); shooter.start(enter := f enter); doEvery(1.0, r shootScreen2); } void segment { BufferedImage img = shooter.latestImage; if (!enabled || img == null || segmenter == null) ret; // man weiß ja nie... // Have picture!! long time = sysNow(); new ImageInfo info; info.image = img; info.segments = segmenter.get(img); this.info = info; done2_always(time, "Make " + nSegments(info.segments)); rstAOA.trigger(); } void aoa { ImageInfo info = this.info; if (info == null) ret; // man weiß ja nie... AOA_CompareImagesToProtos aoa = info.aoa; aoa.addProtos(protos); aoa.addImages(iotaKeys_str( map toBWImage(bufferedImageClips(info.image, info.segments)))); stepAll(aoa); Map protoScores = mapSortedByValue(aoa.scoresForProtos()); Map filtered = filterMap_valuesEqualToOrBiggerThan(protoScores, minScore/100); if (isThings != null) isThings.setImage( mergeBWImagesHorizontally(lookupAllOpt(protos, keys(filtered)))); print(mapValues toIntPercent(protoScores)); latestWithAOA = info; } void cleanMeUp { dispose shooter; } }