Three Senegal fans imprisoned in Morocco over chaos during AFCON 2025 final freed after completing jail terms

Three Senegal fans imprisoned in Morocco over chaos during AFCON 2025 final freed after completing jail terms

Senegalese fans salute their national team during the 2022 AFCON. (Photo: CAF)

Read this story aloud

Listen to the clean text version of this article

Ready
3 min listen
Audio reading is not supported on this browser.

They were sentenced in February alongside 15 other fans and handed prison terms ranging from three months to one year following violent scenes at the AFCON final, including attempting a pitch invasion and deliberately disrupting the match’s proceedings

Three of the 18 Senegalese football fans who were imprisoned in Morocco following chaotic scenes linked to the disputed Africa Cup of Nations Final (AFCON) 2025 final have been released after completing their prison sentences.
The trio, who were freed on Saturday after finishing their three-month sentences, were received by Senegalese officials in Morocco ahead of their return home.
They were sentenced in February alongside 15 other fans and handed prison terms ranging from three months to one year following violent scenes at the AFCON final, including attempting a pitch invasion and deliberately disrupting the match’s proceedings.

More To Read

  • Morocco’s King pardons Senegalese fans jailed after AFCON 2025 Final chaos
  • CAF President Patrice Motsepe arrives in Senegal amid fury over revoked AFCON title
  • Senegal PM Sonko condemns jailing of 18 Senegalese fans in Morocco after AFCON final

“I inform you of the effective release of three of the 18 compatriots detained in Morocco,” Senegalese defence lawyer Patrick Kabou said on X, confirming the development.
The releases mark the latest development in a controversy that has continued to overshadow the 2025 AFCON final, which was marred by violent scenes and subsequent disciplinary and legal action.
Senegal has since taken the matter to the Court of Arbitration for Sport (CAS) after the Confederation of African Football (CAF) overturned their 1–0 victory in Rabat, escalating a dispute that remains unresolved at the highest level of football governance.

Latest Stories

  • Government announces final repatriation flight for Kenyans in South Africa
  • Six killed as matatu, trailer collide head-on along Nakuru-Eldoret highway
  • Egypt end 92-year wait to reach World Cup last 16
  • Ethiopia coffee exports hit record Sh388 billion on rising global demand

CAS has confirmed receipt of the appeal, which challenges both CAF and the Royal Moroccan Football Federation over CAF’s March 17 ruling to overturn the result, stripping Senegal of the title and awarding it to Morocco.
In its appeal, the Senegalese Football Federation (FSF) is asking for the CAF ruling to be overturned and for Senegal to be officially recognised as the tournament winners. Senegal also requested a suspension of the deadline for submitting its full appeal until CAF provides a complete explanation for its ruling.
A panel of arbitrators is expected to be appointed to hear the case, after which a procedural timetable will be established. Under standard regulations, Senegal will be given 20 days to submit its detailed written submission, followed by a further 20 days for the respondents to file their replies.
While the timetable is set under standard rules, CAS cautioned that it is too early to predict how long the process will take or when a hearing will be scheduled.
“At this early stage of proceedings and considering the FSF request to suspend deadlines, it is not possible to anticipate a procedural timeline and to indicate when a hearing will be scheduled,” CAS said last month.

Other Topics To Read

Top Stories Today

  • Government announces final repatriation flight for Kenyans in South Africa
  • Six killed as matatu, trailer collide head-on along Nakuru-Eldoret highway
  • Egypt end 92-year wait to reach World Cup last 16
  • Ethiopia coffee exports hit record Sh388 billion on rising global demand
  • Messi makes history as Argentina survive Cape Verde’s unforgettable World Cup fight
  • Renewable energy boom cuts global fossil fuel bill by Sh62 trillion in 2025

`;
}

return “;
}

function commentActionsMarkup(comment, canComment) {
const likeLabel = comment.liked_by_me ? ‘Liked’ : ‘Like’;
const likeCount = Number(comment.like_count || 0) > 0
? “
: ”;

const likeButton = canComment && comment.status === ‘approved’
? “
: “;

const replyButton = canComment && comment.status === ‘approved’
? “
: ”;

return `

`;
}

function commentMarkup(comment, canComment, isReply = false) {
const pendingBadge = comment.status && comment.status !== ‘approved’
? “
: ”;

const edited = comment.is_edited
? “
: ”;

const repliesHtml = Array.isArray(comment.replies) && comment.replies.length
? `

`
: “;

return `

`;
}

function replyFormMarkup(commentId) {
return `

`;
}

function setNotice(widget, message, type = ‘info’) {
const notice = widget.querySelector(‘[data-role=”notice”]’);
if (!notice) return;

if (!message) {
notice.hidden = true;
notice.textContent = ”;
notice.classList.remove(‘is-error’);
return;
}

notice.hidden = false;
notice.textContent = message;
notice.classList.toggle(‘is-error’, type === ‘error’);
}

function setCount(widget, total) {
const count = widget.querySelector(‘[data-role=”count”]’);
if (!count) return;

const num = Number(total || 0);
count.textContent = num === 1 ? ‘1 comment’ : `${num} comments`;
}

function openReplyBox(widget, commentId) {
widget.querySelectorAll(‘[data-role=”reply-box”]’).forEach(box => {
box.hidden = true;
box.innerHTML = ”;
});

const targetItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (!targetItem) return;

const replyBox = targetItem.querySelector(‘[data-role=”reply-box”]’);
if (!replyBox) return;

replyBox.hidden = false;
replyBox.innerHTML = replyFormMarkup(commentId);

const textarea = replyBox.querySelector(‘textarea’);
if (textarea) textarea.focus();
}

function closeReplyBox(container) {
if (!container) return;
container.hidden = true;
container.innerHTML = ”;
}

async function initCommentsWidget(widget) {
const state = {
articleId: Number(widget.dataset.articleId),
loadUrl: widget.dataset.loadUrl,
storeUrl: widget.dataset.storeUrl,
commentsBaseUrl: widget.dataset.commentsBaseUrl,
canComment: widget.dataset.canComment === ‘1’,
page: 1,
perPage: 10,
sort: ‘newest’,
total: 0,
hasMore: false,
busy: false
};

const list = widget.querySelector(‘[data-role=”list”]’);
const loading = widget.querySelector(‘[data-role=”loading”]’);
const empty = widget.querySelector(‘[data-role=”empty”]’);
const loadMoreBtn = widget.querySelector(‘[data-role=”load-more”]’);
const sortSelect = widget.querySelector(‘[data-role=”sort”]’);
const composerForm = widget.querySelector(‘[data-role=”composer-form”]’);

async function loadComments(reset = true) {
if (state.busy) return;

state.busy = true;
setNotice(widget, ”);
loading.hidden = false;

if (reset) {
state.page = 1;
list.innerHTML = ”;
empty.hidden = true;
}

try {
const url = new URL(state.loadUrl, window.location.origin);
url.searchParams.set(‘page’, state.page);
url.searchParams.set(‘per_page’, state.perPage);
url.searchParams.set(‘sort’, state.sort);

const response = await requestJson(url.toString(), {
method: ‘GET’,
headers: {
‘Accept’: ‘application/json’,
‘X-Requested-With’: ‘XMLHttpRequest’
}
});

const items = Array.isArray(response.data) ? response.data : [];
const meta = response.meta || {};

state.total = Number(meta.total || 0);
state.hasMore = !!meta.has_more;

setCount(widget, state.total);

if (reset) {
list.innerHTML = ”;
}

if (!items.length && reset) {
empty.hidden = false;
} else {
empty.hidden = true;
list.insertAdjacentHTML(
‘beforeend’,
items.map(item => commentMarkup(item, state.canComment, false)).join(”)
);
}

loadMoreBtn.hidden = !state.hasMore;
} catch (error) {
if (!list.children.length) {
empty.hidden = false;
empty.textContent = ‘Unable to load comments right now.’;
}
setNotice(widget, error.message || ‘Unable to load comments.’, ‘error’);
} finally {
loading.hidden = true;
state.busy = false;
}
}

async function submitTopLevelComment(form) {
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘[data-role=”submit-comment”]’);

if (!textarea) return;

const content = textarea.value.trim();
if (!content) return;

const originalText = button ? button.textContent : ”;

try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}

const response = await requestJson(state.storeUrl, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});

textarea.value = ”;

if (response?.data) {
list.insertAdjacentHTML(
‘afterbegin’,
commentMarkup(response.data, state.canComment, false)
);
empty.hidden = true;

if ((response.data.status || ”) === ‘approved’) {
state.total += 1;
setCount(widget, state.total);
}
}

setNotice(widget, response.message || ‘Comment posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post comment.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post comment’;
}
}
}

async function submitReply(form) {
const commentId = Number(form.dataset.commentId || 0);
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘.ev-comments__reply-submit’);

if (!commentId || !textarea) return;

const content = textarea.value.trim();
if (!content) return;

const originalText = button ? button.textContent : ”;

try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}

const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/reply`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});

if (response?.data) {
const parentItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (parentItem) {
const repliesWrap = parentItem.querySelector(‘.ev-comments__replies’);
if (repliesWrap) {
repliesWrap.insertAdjacentHTML(
‘beforeend’,
commentMarkup(response.data, state.canComment, true)
);
}
}
}

closeReplyBox(form.closest(‘[data-role=”reply-box”]’));
setNotice(widget, response.message || ‘Reply posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post reply.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post reply’;
}
}
}

async function toggleLike(button) {
const commentId = Number(button.dataset.commentId || 0);
if (!commentId) return;

const originalHtml = button.innerHTML;

try {
button.disabled = true;
button.innerHTML = ‘Working…’;

const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/like`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({})
});

const liked = !!response?.data?.liked;
const likeCount = Number(response?.data?.like_count || 0);

button.classList.toggle(‘is-liked’, liked);
button.innerHTML = `${liked ? ‘Liked’ : ‘Like’} ${likeCount > 0 ? “ : ”}`;
} catch (error) {
button.innerHTML = originalHtml;
setNotice(widget, error.message || ‘Unable to update like.’, ‘error’);
} finally {
button.disabled = false;
}
}

if (composerForm) {
composerForm.addEventListener(‘submit’, function (e) {
e.preventDefault();
submitTopLevelComment(composerForm);
});
}

if (sortSelect) {
sortSelect.addEventListener(‘change’, function () {
state.sort = this.value || ‘newest’;
loadComments(true);
});
}

if (loadMoreBtn) {
loadMoreBtn.addEventListener(‘click’, function () {
if (state.busy || !state.hasMore) return;
state.page += 1;
loadComments(false);
});
}

widget.addEventListener(‘click’, function (e) {
const likeBtn = e.target.closest(‘[data-action=”toggle-like”]’);
if (likeBtn) {
e.preventDefault();
toggleLike(likeBtn);
return;
}

const replyBtn = e.target.closest(‘[data-action=”toggle-reply”]’);
if (replyBtn) {
e.preventDefault();
openReplyBox(widget, Number(replyBtn.dataset.commentId || 0));
return;
}

const cancelReplyBtn = e.target.closest(‘[data-action=”cancel-reply”]’);
if (cancelReplyBtn) {
e.preventDefault();
closeReplyBox(cancelReplyBtn.closest(‘[data-role=”reply-box”]’));
}
});

widget.addEventListener(‘submit’, function (e) {
const replyForm = e.target.closest(‘.ev-comments__reply-form’);
if (replyForm) {
e.preventDefault();
submitReply(replyForm);
}
});

loadComments(true);
}

document.addEventListener(‘DOMContentLoaded’, function () {
document.querySelectorAll(‘.ev-comments’).forEach(initCommentsWidget);
});
})();

Trending


Six killed as matatu, trailer collide head-on along Nakuru-Eldoret highwayNews
|Rachael Mutabasi
|33 minutes ago

Renewable energy boom cuts global fossil fuel bill by Sh62 trillion in 2025Business
|Alfred Onyango
|2 hours ago

Pakistan probes human placenta trafficking ring linked to anti-ageing injectionsHealth
|Charity Kilei
|11 hours ago

Final repatriation flight for Kenyans in South Africa set for July 9News
|Rachael Mutabasi
|10 minutes ago

Egypt end 92-year wait to reach World Cup last 16News
|Erick Kariuki
|1 hour ago

Court bars activist Morara Kebaso from making defamatory statements against Borabu MP Patrick OseroNews
|Carolyne Kubwa
|1 day ago

Cancer tumors turn immune cells from fighters into feeders – studyHealth
|XINHUA
|22 hours ago

MPs raise alarm over missing land records, vehicle logbooks at State Department for LabourNews
|Rachael Mutabasi
|17 hours ago

Kenya qualifies for FIFAe Continental Championship after historic top-eight finishNews
|Erick Kariuki
|1 day ago

High Court blocks Kenya Railways bid to evict Muthurwa estate residentsNews
|Carolyne Kubwa
|1 day ago

Share.
Leave A Reply

Exit mobile version