Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion bin/modules/beerizer/beerizer_module.dart
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,12 @@ class BeerizerModule extends BotModule {
beerString = 'Woho! New beers are releasing today! :beers:\n\n';
}
for (var beer in beers) {
final rating =
beer.untappdRating == 'N/A' ? 'N/A' : '${beer.untappdRating} :star:';

beerString += '**${beer.name}**\n'
'${beer.brewery}\n'
'<:untappd:1333124979386220604> ${beer.untappdRating} :star:\n'
'<:untappd:1333124979386220604> $rating\n'
'*${beer.style}*\n'
'\n';
}
Expand Down
7 changes: 6 additions & 1 deletion bin/modules/beerizer/beerizer_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,12 @@ class BeerizerService {

String _cleanUpUntappdRating(String rating) {
try {
if (rating.length < 5) return 'N/A';
if (rating.length < 5 ||
rating.contains('Missi') ||
rating.contains('?') ||
rating.contains('N/A')) {
return 'N/A';
}
return rating.trim().substring(0, 5).trim();
} catch (e) {
e.recordError(
Expand Down
48 changes: 45 additions & 3 deletions bin/modules/untappd/untapped_module.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'dart:async';
// import 'package:hive/hive.dart';
import 'package:nyxx/nyxx.dart';
import 'package:nyxx_commands/nyxx_commands.dart';
import 'package:puppeteer/puppeteer.dart';
import 'package:web_scraper/web_scraper.dart';

import '../../utils/error_monitor.dart';
Expand Down Expand Up @@ -444,16 +445,57 @@ class UntappdModule extends BotModule {

/// Get latest checkin for given untapped username
Future<UntappdCheckin?> _getLatestCheckin(String untappdUsername) async {
Browser? browser;
try {
final webScraper = WebScraper('https://untappd.com');
print('Untappd: Launching browser...');
// Launch puppeteer browser
browser = await puppeteer.launch(
headless: true,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--disable-accelerated-2d-canvas',
'--no-first-run',
'--no-zygote',
'--disable-gpu',
],
);

var loadSuccess = await webScraper.loadWebPage('/user/$untappdUsername');
final page = await browser.newPage();

if (!loadSuccess) {
// Set user agent to mimic a real browser
await page.setUserAgent(
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36');

print('Untappd: Navigating to Untappd page for $untappdUsername...');
// Navigate to the untappd user page
final url = 'https://untappd.com/user/$untappdUsername';
await page.goto(url, wait: Until.networkIdle);

print('Untappd: Waiting for page to load completely...');
// Wait a bit longer to ensure Cloudflare challenge completes
await Future.delayed(Duration(seconds: 5));

// Check if we're still on a Cloudflare challenge page
final title = await page.title;
if (title?.contains('Just a moment') == true) {
print('Untappd: Still on Cloudflare challenge page, waiting longer...');
await Future.delayed(Duration(seconds: 10));
}

print('Untappd: Getting page content for $untappdUsername...');
// Get the HTML content after Cloudflare challenge is completed
final body = await page.content ?? '';

if (body.isEmpty) {
throw Exception(
'Failed to load Untappd page for user $untappdUsername');
}

final webScraper = WebScraper();
webScraper.loadFromString(body);

final checkins = webScraper.getElementAttribute(
'div#main-stream > *', 'data-checkin-id');

Expand Down
1 change: 1 addition & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ dependencies:
web_scraper:
git: https://github.com/oelburk/web_scraper.git
sentry: ^9.0.0
puppeteer: ^3.18.0

dev_dependencies:
lints: ^5.1.1
Expand Down